본문 바로가기
프로그래머스/[프로그래머스 - JAVA] Lv.0

[프로그래머스 - JAVA] 캐릭터의 좌표

by 코딩하는 흰둥이 2023. 3. 15.

 

  • 입출력 예
keyinput board result
["left", "right", "up", "right", "right"] [11, 11] [2, 1]
["down", "down", "down", "down", "down"] [7, 9] [0, -4]

  • 입출력 예 설명

1. 입출력 예 설명 #1
[0, 0]에서 왼쪽으로 한 칸 오른쪽으로 한 칸 위로 한 칸 오른쪽으로 두 칸 이동한 좌표는 [2, 1]입니다.

 

2. 입출력 예 설명 #2

[0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.


  • 내 풀이
class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int[] answer = {};
       
        // "left", "left", "left", "right" 는 -1 , -1 , -1 , +1 이로 보자면 -2가 맞지만
        // board가 3 ,3 일때 상하좌우가 1칸씩 밖에 되지 않기 때문에 -로 계속 가든 +1 로 가든 그자리에서만 있어야 한다
        // 그 상태로 +1 혹은 -1 이 들어오면 0 , 0 이 된다
        int[] half = {(board[0] -1) / 2 ,(board[1] -1) / 2};
        answer = new int[]{0,0};

        for (int i = 0; i < keyinput.length; i++) {
            if ("left".equals(keyinput[i]) && answer[0] > -half[0]){
                answer[0]--;
            } else if ("right".equals(keyinput[i]) && answer[0] < half[0]) {
                answer[0]++;
            } else if ("up".equals(keyinput[i]) && answer[1] < half[1]) {
                answer[1]++;
            } else if ("down".equals(keyinput[i]) && answer[1] > -half[1]) {
                answer[1]--;
            }
        }
        
        return answer;
    }
}

 

 

주석으로도 적어 놓았지만 board의 배열 길이를 먼저 생각해야 한다

예로 keyinput 에 "reft" "reft" "reft" "reft" "reft"  5번을 입력하면 캐릭터는 왼쪽으로 -5 칸을 간게 맞지만

board의 길이가 7 , 7 이라고 가정할때

  3  
-3 0 3
  -3  

왼쪽 길이는 -3으로 -3 이상 갈수가 없다

그 말은 "reft" "reft" "reft" "reft" "reft"  5번 입력하였을때 -3에서 제자리 걸음을 하고 있다는 뜻이다 이상태로 "right" 을 누룬다면 "reft" "reft" "reft" "reft" "reft"  5번 입력한 -5가 아닌 -3에서 +1을 하여 -2가 된다 주의해야한다.

 

 

 


  • 다른 사람 풀이
class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int[] now = {0, 0};
        for (int i = 0; i < keyinput.length; i++){
            if(keyinput[i].equals("left")) now[0] -= now[0]>-(board[0]/2)?1:0;
            else if(keyinput[i].equals("right")) now[0] += now[0]<(board[0]/2)?1:0;
            else if(keyinput[i].equals("down")) now[1] -= now[1]>-(board[1]/2)?1:0;
            else if(keyinput[i].equals("up")) now[1] += now[1]<(board[1]/2)?1:0;
            }
        return now;
    }
}

 

 

 

문제를 풀고 나면 대부분 비슷비슷한 풀이형태를 띄게 되는데 이번에 풀이는 너무나 달라서 직접 보기를 추천한다.

댓글