공원 산책

로봇 강아지가 공원에서 주어진 명령을 따라 이동하는 문제를 해결하기 위해 다음과 같은 단계를 수행한다.

  1. 공원 정보 처리
    • park 배열을 순회하여 각 위치를 확인하고, 시작점(‘S’)의 좌표를 찾는다.
    • 공원의 각 위치를 2차원 배열이나 리스트로 표현하여 이동 가능 여부(지나다닐 수 있는 길 ‘O’ 또는 장애물 ‘X’)를 표시한다.
  2. 명령 분해 및 방향 설정
    • routes 배열의 각 명령을 순회하면서 문자열을 방향과 거리로 분리한다.
    • 방향에 따라 좌표 변화량을 설정한다:
    • 동쪽(E): x 증가 (+1)
    • 서쪽(W): x 감소 (-1)
    • 남쪽(S): y 증가 (+1)
    • 북쪽(N): y 감소 (-1)
  3. 이동 가능 여부 확인 및 위치 업데이트
    • 명령에 따른 이동 경로를 한 칸씩 확인하면서 다음을 검사한다:
    • 공원의 범위를 벗어나는지 확인합니다. 좌표가 음수이거나 공원의 크기를 초과하면 범위를 벗어난 것.
    • 이동 경로 중에 장애물(‘X’)이 있는지 확인한다.
    • 위 조건 중 하나라도 만족하면 해당 명령은 무시하고 다음 명령으로 넘어간다.
    • 모든 조건을 만족하면 로봇 강아지의 현재 위치를 명령에 따른 위치로 업데이트한다.
  4. 최종 위치 반환
    • 모든 명령을 수행한 후 로봇 강아지의 최종 위치를 [세로 좌표(y), 가로 좌표(x)] 형태의 배열로 반환한다.
public class ParkWalk {

    public int[] solution(String[] park, String[] routes) {
        int height = park.length, width = park[0].length();
        boolean[][] map = new boolean[height][width];
        int x = 0, y = 0;
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                char cell = park[i].charAt(j);
                map[i][j] = (cell != 'X');
                if (cell == 'S') {
                    x = j;
                    y = i;
                }
            }
        }

        for (String route : routes) {
            String[] parts = route.split(" ");
            String direction = parts[0];
            Integer distance = Integer.parseInt(parts[1]);
            int sx = x, sy = y;
            for (int i = 0; i < distance; i++) {
                if (direction.equals("E")) sx++;
                if (direction.equals("W")) sx--;
                if (direction.equals("N")) sy--;
                if (direction.equals("S")) sy++;
                if (sx < 0 || sx >= width || sy < 0 || sy >= height || !map[sy][sx]) {
                    sx = x;
                    sy = y;
                    break;
                }
            }
            x = sx;
            y = sy;
        }
        return new int[]{y, x};
    }
}

코딩테스트 연습 - 공원 산책