자라나라 개발머리

[프로그래머스/JAVA] 공원 산책 본문

알고리즘/프로그래머스

[프로그래머스/JAVA] 공원 산책

iammindy 2023. 4. 14. 12:57

문제

문제 설명
지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.

- ["방향 거리", "방향 거리" … ]


예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.

- 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
- 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.

 

위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.

공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

(이하 생략)

풀이

내 답안

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int sx,sy;
        int xlim, ylim;
        int[] answer = new int[2];
        
        //공원 크기 저장
        xlim = park[0].length();
        ylim = park.length;
        
        //시작 위치 탐색
        sx=0; sy=0;
        
        SearchStartLocation :
        for(int i=0; i<ylim; i++) {
            for(int j=0; j<xlim; j++) {
                if(park[i].charAt(j)=='S')  {
                    sx = j; sy = i;
                    break SearchStartLocation;
                }
            }   
        }
        
        System.out.println(sy+" "+sx);
        
        //이동
        //수행 반복
        for ( String route : routes) {
            
            String direction = route.split(" ")[0];
            int step = Integer.parseInt(route.split(" ")[1]);
            int tmpx = sx;
            int tmpy = sy;
            boolean flag = false;
            
            //step 횟수만큼 반복
            StepLoop :
            for(int i=0; i<step; i++) {
                
                //해당 방향으로 한 칸 전진
                switch(direction) {
                    case "E": tmpx++; break;
                    case "W": tmpx--; break;
                    case "S": tmpy++; break;
                    case "N": tmpy--; break;
                }
                
                //장애물 여부, 공원 내 여부 확인
                if( tmpx < 0 || tmpx >= xlim || tmpy < 0 || tmpy >= ylim || park[tmpy].charAt(tmpx) == 'X' ) {
                    flag = true; 
                    break StepLoop;
                }
            }
            
            if( !flag ) {
                sx = tmpx;
                sy = tmpy;
            }
        }
        
        answer[0] = sy;
        answer[1] = sx;
        
        return answer;
    }
}

 

풀이 과정

 

1. 에러 해결 : StringIndexOutOfBoundsException: String index out of range: 3

위 에러 때문에 계에속 삽질했던 문제. 위 에러가 났던 원인은 아래 코드 때문이었다.

//장애물 여부, 공원 내 여부 확인
if( park[tmpy].charAt(tmpx) == 'X' || tmpx < 0 || tmpx >= xlim || tmpy < 0 || tmpy >= ylim ) {
	break StepLoop;
}

 

자꾸 범위를 벗어났다길래 엄한데에서 삽질하다가 디버그하면서 발견했다.

park[tmpy].charAt(tmpx) == 'X' 이 코드가 앞에 있으니 뒤에 있는 xlim, ylim 코드가 힘을 못쓴거다.

순서를 바꿔주니 에러가 해결됐다.