Post

[이것이 코딩 테스트다 with Python] 미로 탈출(Java)

Goal

“이것이 코딩 테스트다 with Python” 교재의 문제를 분석하고 코드와 함께 이해해보기 위한 글입니다.

문제 분석

주어지는 조건이 BFS로 최단 거리를 풀라는 의도가 담겨져 있다고 느껴지네요. 시작 포인트부터 상하좌우를 살펴 맵 밖으로 나가지 않도록 하는 조건과 이전 위치보다 탈출구에 가까운지를 확인하는 조건을 갖는 BFS를 구현해 최단 거리를 출력하는 프로그램을 작성해보겠습니다.

코드 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class MazeEscape { //p152
    static int row, col;
    static int[][] maze;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        row = Integer.parseInt(st.nextToken());
        col = Integer.parseInt(st.nextToken());
        maze = new int[row][col];

        for (int i = 0; i < row; i++) {
            String[] splitStr = br.readLine().split("");
            for (int j = 0; j < col; j++) {
                maze[i][j] = Integer.parseInt(splitStr[j]);
            }
        }

        System.out.println(bfs(0, 0));
    }

    private static int bfs(int x, int y) {
        Queue<Integer> que = new LinkedList<>();
        que.add(x);
        que.add(y);
        int cnt = 1;
        int nx;
        int ny;

        while (!que.isEmpty()) {
            x = que.poll();
            y = que.poll();
            maze[x][y] = 0; //방문처리

            for (int i = 0; i < 4; i++) {
                nx = x + dx[i];
                ny = y + dy[i];
                if (nx < 0 || nx > row - 1 || ny < 0 || ny > col - 1) continue;
                if (maze[nx][ny] == 1 && (nx > x || ny > y)) {
                    cnt++;
                    que.add(nx);
                    que.add(ny);
                }
            }
        }
        return cnt;
    }
}
This post is licensed under CC BY 4.0 by the author.