[프로그래머스/Java] Lv.0 캐릭터의 좌표

febCho·2024년 5월 22일
0

코딩테스트

목록 보기
202/253
post-thumbnail

문제

머쓱이는 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]까지 이동할 수 있습니다.

- 제한사항

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

풀이

우선 출발점인 [0, 0]으로 반환할 배열 answer를 초기화 한 뒤 주어진 정수 배열 board를 통해 경계값을 설정해 주었다.

그리고 for문으로 루프를 돌며, 입력된 방향키가 저장되어 있는 문자열 배열 keyinput의 요소를 꺼내어 확인한다. 이때, 코드의 복잡성을 최소화하기 위해 switch문을 사용했다.

up, down, left, right 총 4개의 case가 있고, 경계값보다 값이 작다면 복합 연산자를 통해 값을 변경해준다. 이때 if문으로 조건 체크 시 중요한 건 down, left와 같이 마이너스 연산이 들어가는 경우 각각의 경계값에 -를 붙여 주어야 한다는 점이다.

입력 방향키에 해당하는 연산을 수행한 뒤에는 switch문을 빠져 나올 수 있도록 break;를 해준다.

class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int[] answer = {0, 0};
        int maxX = board[0] / 2;
        int maxY = board[1] / 2;
        
        for (String key : keyinput) {
            switch (key) {
                case "up":
                    if(answer[1] < maxY) answer[1] += 1;
                    break;
                    
                case "down":
                    if(answer[1] > -maxY) answer[1] -= 1;
                    break;
                    
                case "left":
                    if(answer[0] > -maxX) answer[0] -= 1;
                    break;
                    
                case "right":
                    if(answer[0] < maxX) answer[0] += 1;
                    break;
            }
        }
        
        return answer;
    }
}

결과

profile
Done is better than perfect.

0개의 댓글