Algorithm/Java

프로그래머스 - 공원 산책 JAVA :: 172928

고고마코드 2023. 8. 24. 13:59
반응형

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/172928


문제 이해하기

  • 시작은 어떤 공간에서든 할 수 있다.
  • 대각선으로는 이동할 수 없고, 동서남북으로만 이동할 수 있다.
  • 장애물이 있는 곳으로는 이동할 수 없으며, 이동할 수 없는 경우는 해당 명령은 아예 취소한다.
  • 외부로 벗어나는 경우는 이동할 수 없으며, 이동할 수 없는 경우는 해당 명령은 아예 취소한다.

문제 풀이

boolean[][] parkFull = new boolean[park.length][park[0].length()];

int x = 0, y = 0;
int xWall = parkFull.length, yWall = parkFull[0].length;
for(int i=0; i<park.length; i++) {
    char[] cols = park[i].toCharArray();
    for(int j=0; j<cols.length; j++) {
        if(cols[j] == 'O') parkFull[i][j] = true;
        else if(cols[j] == 'S') {
            parkFull[i][j] = true;
            x = i;
            y = j;
        }
    }
}

먼저 배열에 공원을 그리는 것으로 시작했습니다.
주어진 문자열 park를 boolean 타입의 이차원 배열로 변환합니다.
이 때, 이동할 수 있는 곳은 true, 장애물이 있는 곳은 false로 저장하고, 시작 위치를 기억합니다.

for(String route : routes) {
    String[] r = route.split(" ");
    int step = Integer.parseInt(r[1]);
    int target = 0, temp = 0;

    switch(r[0]) {
    case "E":
        temp = y;
        while(target++ < step && y+1 < yWall && parkFull[x][y+1]) y++;
        if(target-1 != step) y = temp;
        break;
    case "W":
        temp = y;
        while(target++ < step && y-1 >= 0 && parkFull[x][y-1]) y--;
        if(target-1 != step) y = temp;
        break;
    case "S":
        temp = x;
        while(target++ < step && x+1 < xWall && parkFull[x+1][y]) x++;
        if(target-1 != step) x = temp;
        break;
    case "N":
        temp = x;
        while(target++ < step && x-1 >= 0 && parkFull[x-1][y]) x--;
        if(target-1 != step) x = temp;
        break;
    }
}

공원을 이차원 배열로 그려놨기 때문에, 명령을 순서대로 수행하면 됩니다.
x 또는 y의 값이 배열의 범위를 벗어나지 않고, 장애물을 만나지 않을 경우만 명령을 수행합니다.

전체 코드

class Solution {
    public int[] solution(String[] park, String[] routes) {
        boolean[][] parkFull = new boolean[park.length][park[0].length()];

        int x = 0, y = 0;
        int xWall = parkFull.length, yWall = parkFull[0].length;
        for(int i=0; i<park.length; i++) {
            char[] cols = park[i].toCharArray();
            for(int j=0; j<cols.length; j++) {
                if(cols[j] == 'O') parkFull[i][j] = true;
                else if(cols[j] == 'S') {
                    parkFull[i][j] = true;
                    x = i;
                    y = j;
                }
            }
        }

        for(String route : routes) {
            String[] r = route.split(" ");
            int step = Integer.parseInt(r[1]);
            int target = 0, temp = 0;

            switch(r[0]) {
            case "E":
                temp = y;
                while(target++ < step && y+1 < yWall && parkFull[x][y+1]) y++;
                if(target-1 != step) y = temp;
                break;
            case "W":
                temp = y;
                while(target++ < step && y-1 >= 0 && parkFull[x][y-1]) y--;
                if(target-1 != step) y = temp;
                break;
            case "S":
                temp = x;
                while(target++ < step && x+1 < xWall && parkFull[x+1][y]) x++;
                if(target-1 != step) x = temp;
                break;
            case "N":
                temp = x;
                while(target++ < step && x-1 >= 0 && parkFull[x-1][y]) x--;
                if(target-1 != step) x = temp;
                break;
            }
        }

        return new int[] {x, y};
    }
}

정확성 테스트

테스트 1 〉 통과 (11.25ms, 85.9MB)
테스트 2 〉 통과 (10.02ms, 70MB)
테스트 3 〉 통과 (8.11ms, 73.1MB)
테스트 4 〉 통과 (8.89ms, 82.4MB)
테스트 5 〉 통과 (9.15ms, 68.2MB)
테스트 6 〉 통과 (9.08ms, 84MB)
테스트 7 〉 통과 (8.59ms, 77.7MB)
테스트 8 〉 통과 (11.24ms, 76.2MB)
테스트 9 〉 통과 (9.36ms, 77.5MB)
테스트 10 〉 통과 (9.58ms, 77MB)
테스트 11 〉 통과 (9.61ms, 72.6MB)
테스트 12 〉 통과 (11.37ms, 74.5MB)
테스트 13 〉 통과 (9.45ms, 70.8MB)
테스트 14 〉 통과 (10.77ms, 79MB)
테스트 15 〉 통과 (8.67ms, 69.8MB)
테스트 16 〉 통과 (8.26ms, 83.1MB)
테스트 17 〉 통과 (10.74ms, 77.2MB)
테스트 18 〉 통과 (10.58ms, 77.7MB)
테스트 19 〉 통과 (9.98ms, 79.2MB)
테스트 20 〉 통과 (10.59ms, 76.8MB)
반응형