캐릭터의 좌표 Lv. 0

박영준·2023년 5월 16일
0

코딩테스트

목록 보기
93/300

문제 설명

머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.

  • [0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.
class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int[] answer = {};
        return answer;
    }
}

제한 사항

  • board은 [가로 크기, 세로 크기] 형태로 주어집니다.
  • board의 가로 크기와 세로 크기는 홀수입니다.
  • board의 크기를 벗어난 방향키 입력은 무시합니다.
  • 0 ≤ keyinput의 길이 ≤ 50
  • 1 ≤ board[0] ≤ 99
  • 1 ≤ board[1] ≤ 99
  • keyinput은 항상 up, down, left, right만 주어집니다.

입출력 예

입출력 예 설명

  • 입출력 예 설명 #1

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

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

해결법

방법 1

class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int[] now = {0, 0};		// 현재 위치좌표
        int maxWidth = board[0] / 2;		// x축 최대 좌표
        int maxLength = board[1] / 2;		// y축 최대 좌표
        
        for (int i = 0; i < keyinput.length; i++) {
            if (keyinput[i].equals("left")) {            // left 를 눌렀을때
                now[0] -= (now[0] > -(maxWidth) ? 1 : 0);		//x축 (-)최대좌표보다 크면 1을 빼고, 아니면 0을 뺌    
            } else if (keyinput[i].equals("right")) {            // right 를 눌렀을때
                now[0] += (now[0] < (maxWidth) ? 1 : 0);
            } else if (keyinput[i].equals("down")) {            // down 를 눌렀을때
                now[1] -= (now[1] > -(maxLength) ? 1 : 0);
            } else if (keyinput[i].equals("up")) {            // up 를 눌렀을때
                now[1] += (now[1] < (maxLength) ? 1 : 0);
            }
         }
         
         return now;
    }
}
  • equals()

    참고: ==, equals(), contains() - 2) equals() 와 contains()

  • now[0] -= (now[0] > -(maxWidth) ? 1 : 0);

    • 여기서 left를 눌렀을 때, true일 경우 1을 빼준다는 것은 그 방향으로 이동시키는 것뿐이다.
    • 나머지 경우도 동일.
    • maxWidth, maxLength 으로 true면 1, false면 0
      • 방법 1처럼 따로 맵 크기를 벗어날 경우를 두지 않고, 계산식에서부터 판단 가능하도록 만듦.

방법 2 : 틀린 방법

class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int[] answer = {0, 0};		// 캐릭터의 시작 좌표
        
        // 이동할 좌표
        for (int i = 0; i < keyinput.length; i++) {
        	switch (keyinput[i]) {
            	case "up" : answer[1]++;
                	break;
                case "down" : answer[1]--;
                	break;
                case "left" : answer[0]--;
                	break;
                case "right" : answer[0]++;
                	break;    
            }
        }
        
        // 맵 크기를 벗어날 경우 : x 좌표
        if (Math.abs(answer[0]) > board[0] / 2) {
        	if (answer[0] > 0) {
            	answer[0] -= 1;	
			} else {
            	answer[0] += 1;
            }
        }
        
        // 맵 크기를 벗어날 경우 : y 좌표
        if (Math.abs(answer[1]) > board[1] / 2) {
        	if (answer[1] > 0) {
            	answer[1] -= 1;	
			} else {
            	answer[1] += 1;
            }
        }
        
        return answer;      // 최종적으로 캐릭터 위치 좌표
    }
}

캐릭터의 좌표

profile
개발자로 거듭나기!

0개의 댓글