[PGS] 공원 산책 - JAVA

최영환·2023년 8월 13일
0

Programmers

목록 보기
21/43

💡 문제

💬 입출력 예시

📌 풀이(소스코드)

class Solution {
    
    public int[] solution(String[] park, String[] routes) {
        int w = park.length;
        int h = park[0].length();

        int[] dr = {0, 0, 1, -1};
        int[] dc = {1, -1, 0, 0};

        int[] pos = new int[2];
        char[][] grid = new char[w][h];

        for (int i = 0; i < w; i++) {
            String s = park[i];
            for (int j = 0; j < h; j++) {
                grid[i][j] = s.charAt(j);
                if (grid[i][j] == 'S') {
                    pos[0] = i;
                    pos[1] = j;
                }
            }
        }

        for (String route : routes) {
            char op = route.charAt(0);
            int index = getDirectionIndex(op);
            int n = route.charAt(2) - '0';

            int r = pos[0];
            int c = pos[1];
            boolean isValid = true;
            // n 번 반복
            for (int i = 0; i < n; i++) {
                // 명령 수행
                int nr = r + dr[index];
                int nc = c + dc[index];

                // 범위 벗어나는지, 장애물인지 체크
                if (isNotValid(w, h, grid, nr, nc)) {
                    isValid = false;
                    break;
                }

                r = nr;
                c = nc;
            }
            // 이동
            if (isValid) {
                pos[0] = r;
                pos[1] = c;
            }
        }

        return pos;
    }

    private int getDirectionIndex(char op) {
        if (op == 'E') {
            return 0;
        } else if (op == 'W') {
            return 1;
        } else if (op == 'S') {
            return 2;
        }
        return 3;
    }

    private boolean isNotValid(int w, int h, char[][] grid, int nr, int nc) {
        return nr < 0 || nc < 0 || nr >= w || nc >= h || grid[nr][nc] == 'X';
    }
}

📄 해설

접근

  • 방향 배열을 사용한 4방 탐색을 통해 구현하는 문제로, 구현 알고리즘의 기본 +@ 느낌의 문제이다.
  • 난이도가 높지 않은 구현 문제이므로, 문제에서 요구한 조건을 다 충족시키면 된다.

과정

  • 문자를 담을 격자판 grid 를 초기화하면서, S 를 찾으면 이를 시작점으로 초기화한다. 시작점은 현재 위치를 나타낼 배열인 pos 에 담는다. (grid 를 만들지 않고, park 배열을 그대로 사용해도 무방하다.)
  • 입력받은 routes 내의 명령에 따라, 방향을 정하고, 몇칸 움직일지에 대한 정보를 통해 이동을 시작한다.
  • 현재 위치를 임시변수인 rc 에 넣고, 명령대로 이동을 수행한다. 이때 공원의 범위를 벗어나거나, 지나갈 수 없는 칸이면 isValid 의 값을 false 로 바꾸고 해당 명령을 취소한다.
  • 명령이 수행 가능한지의 여부는 isValid 를 통해 판단한다. 가능하면 pos 배열의 값을 변경하고, 그렇지 않다면 다음 명령으로 이동한다.
  • 이 과정을 반복하면 pos 배열에 마지막 위치가 저장된다.
profile
조금 느릴게요~

0개의 댓글