공원 산책

하이솝·2026년 3월 11일

2026.03.11

소요 시간: 30분

나의 정답
생각했던 풀이 알고리즘 자체는 많았지만, move() 구현 과정에서 사소하지만 많은 실수(col += i, col + i와 비교하는 등)가 발생해서 AI를 이용해 오류를 찾아냈음. 처음 코드를 구현할 때 제대로 작성하는 연습이 필요함

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int []currentLocation = new int[2]; // 현재 위치를 나타내는 배열
        // 시작 지점 구하기
        for (int i = 0; i < park.length; i++) {
            for (int j = 0; j < park[i].length(); j++) {
                if (park[i].charAt(j) == 'S') {
                    currentLocation[0] = i;
                    currentLocation[1] = j;
                    break;
                }
            }
        }
        for (int i = 0; i < routes.length; i++) {
            String []route = routes[i].split(" ");
            String direction = route[0]; // 방향
            int distance = Integer.parseInt(route[1]); // 이동 거리
            move(park, currentLocation, direction, distance);
        }
        return currentLocation;
    }
    public void move(String[] park, int[] currentLocation, String direction, int distance) {
        int row = currentLocation[0];
        int col = currentLocation[1];
        switch(direction) {
            case "N": {
                for (int i = 1; i <= distance; i++) {
                    if (row - 1 < 0 || park[row - 1].charAt(col) == 'X') { // 범위를 벗어나거나 장애물을 만났을 때
                        row = currentLocation[0];
                        col = currentLocation[1];
                        break;
                    }
                    row -= 1;
                }
                break;
            }
            case "S": {
                for (int i = 1; i <= distance; i++) {
                    if (row + 1 > park.length - 1 || park[row + 1].charAt(col) == 'X') { // 범위를 벗어나거나 장애물을 만났을 때
                        row = currentLocation[0];
                        col = currentLocation[1];
                        break;
                    }
                    row += 1;
                }
                break;
            }
            case "W": {
                for (int i = 1; i <= distance; i++) {
                    if (col - 1 < 0 || park[row].charAt(col - 1) == 'X') { // 범위를 벗어나거나 장애물을 만났을 때
                        row = currentLocation[0];
                        col = currentLocation[1];
                        break;
                    }
                    col -= 1;
                }
                break;
            }
            case "E": {
                for (int i = 1; i <= distance; i++) {
                    if (col + 1 > park[row].length() - 1 || park[row].charAt(col + 1) == 'X') { // 범위를 벗어나거나 장애물을 만났을 때
                        row = currentLocation[0];
                        col = currentLocation[1];
                        break;
                    }
                    col += 1;
                }
                break;
            }
        }
        currentLocation[0] = row;
        currentLocation[1] = col;
    }
}

AI 정답
contains()indexOf()를 활용하여 더 쉽게 시작 지점을 찾아냄
move() 메소드를 switch를 사용하는 대신 매개변수로 방향을 전달하여 더 간단하게 구현함

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int[] cur = new int[2];
        int H = park.length;
        int W = park[0].length();
        // 1. 시작 지점 찾기 (indexOf와 contains를 활용하면 더 깔끔합니다)
        for (int i = 0; i < H; i++) {
            if (park[i].contains("S")) {
                cur[0] = i;
                cur[1] = park[i].indexOf("S");
                break;
            }
        }
        // 2. 이동 명령 수행
        for (String route : routes) {
            String[] parts = route.split(" ");
            String dir = parts[0];
            int dist = Integer.parseInt(parts[1]);
            int dr = 0, dc = 0;
            if (dir.equals("N")) dr = -1;
            else if (dir.equals("S")) dr = 1;
            else if (dir.equals("W")) dc = -1;
            else if (dir.equals("E")) dc = 1;
            // 이동 가능 여부 체크 및 위치 업데이트
            move(park, cur, dr, dc, dist, H, W);
        }
        return cur;
    }
    private void move(String[] park, int[] cur, int dr, int dc, int dist, int H, int W) {
        int nr = cur[0];
        int nc = cur[1];
        // 한 칸씩 전진하며 검사
        for (int i = 1; i <= dist; i++) {
            int checkR = cur[0] + (dr * i);
            int checkC = cur[1] + (dc * i);
            // 범위 밖이거나 장애물(X)이면 바로 종료 (이동 취소)
            if (checkR < 0 || checkR >= H || checkC < 0 || checkC >= W || 
                park[checkR].charAt(checkC) == 'X') {
                return;
            }
            // 검사용 임시 좌표 업데이트
            nr = checkR;
            nc = checkC;
        }
        // 모든 루프를 무사히 통과했을 때만 실제 좌표 업데이트
        cur[0] = nr;
        cur[1] = nc;
    }
}

0개의 댓글