๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽฏPS - Baekjoon, etc/BFS

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค] ๋ฏธ๋กœ ํƒˆ์ถœ

by hyeon-z 2023. 3. 28.

์‹œ๊ฐ„์ œํ•œ

1์ดˆ

 

๋ฌธ์ œ

๋™๋นˆ์ด๋Š” N X M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์˜ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜€ ์žˆ๋‹ค. 

๋ฏธ๋กœ์—๋Š” ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ์˜ ๊ดด๋ฌผ์ด ์žˆ์–ด ์ด๋ฅผ ํ”ผํ•ด ํƒˆ์ถœํ•ด์•ผ ํ•œ๋‹ค.
๋™๋นˆ์ด์˜ ์œ„์น˜๋Š” (1, 1)์ด๊ณ  ๋ฏธ๋กœ์˜ ์ถœ๊ตฌ๋Š”(N, M)์˜ ์œ„์น˜์— ์กด์žฌํ•˜๋ฉฐ ํ•œ ๋ฒˆ์— ํ•œ ์นธ์”ฉ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋•Œ ๊ดด๋ฌผ์ด ์žˆ๋Š” ๋ถ€๋ถ„์€ 0์œผ๋กœ, ๊ดด๋ฌผ์ด ์—†๋Š” ๋ถ€๋ถ„์€ 1๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค.
๋ฏธ๋กœ๋Š” ๋ฐ˜๋“œ์‹œ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ œ์‹œ๋œ๋‹ค. 

์ด๋•Œ ๋™๋นˆ์ด๊ฐ€ ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์›€์ง์—ฌ์•ผ ํ•˜๋Š” ์ตœ์†Œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์‹œ์˜ค.
์นธ์„ ์…€ ๋•Œ๋Š” ์‹œ์ž‘ ์นธ๊ณผ ๋งˆ์ง€๋ง‰ ์นธ์„ ๋ชจ๋‘ ํฌํ•จํ•ด์„œ ๊ณ„์‚ฐํ•œ๋‹ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋‘ ์žฅ์ˆ˜ N, M (4 < N, M < 200)์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ M๊ฐœ์˜ ์žฅ์ˆ˜(0 ํ˜น์€ 1)๋กœ ๋ฏธ๋กœ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
๊ฐ๊ฐ์˜ ์ˆ˜๋“ค์€ ๊ณต๋ฐฑ ์—†์ด ๋ถ™์–ด์„œ ์ž…๋ ฅ์œผ๋กœ ์ œ์‹œ๋œ๋‹ค.
๋˜ํ•œ ์‹œ์ž‘ ์นธ๊ณผ ๋งˆ์ง€๋ง‰ ์นธ์€ ํ•ญ์ƒ 1์ด๋‹ค.

 

์ž…๋ ฅ ์˜ˆ์‹œ

5 6
101010
111111
000001
111111
111111

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ตœ์†Œ ์ด๋™ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ถœ๋ ฅ ์˜ˆ์‹œ

10

 


๋ฌธ์ œ ํ’€์ด ๊ณผ์ •

๋ฏธ๋กœ ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());

maze = new int[N][M];
visited = new boolean[N][M];

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

N๊ณผ M์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด BufferedReader์™€ StringTokenizer๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ๋ฐ›๊ณ 

์–ผ์Œ ํ‹€์˜ ์ •๋ณด๋Š” ๊ณต๋ฐฑ ์—†์ด ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ split์„ ํ†ตํ•ด ์ž…๋ ฅ๋ฐ›์•˜๋‹ค.

 

์ขŒํ‘œ๋ฅผ ์ €์žฅํ•  Point ํด๋ž˜์Šค ๊ตฌํ˜„

 

class Point {
    int x;
    int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

 

bfsํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

 

BFS๋Š” ์‹œ์ž‘ ์ง€์ ์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ BFS๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜๋ฉด ์‰ฝ๋‹ค.

BFS์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜] BFS (Java)

BFS๋ž€? Breadth First Search, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ • 1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. 2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ

hyeon-z.tistory.com

 

์ฒ˜์Œ ๋™๋นˆ์ด๊ฐ€ ์œ„์น˜ํ•ด ์žˆ๋Š” (0, 0) ์ขŒํ‘œ, ์ฆ‰ ์ฒ˜์Œ ์ขŒํ‘œ๋ฅผ ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ํ•œ๋‹ค.

Queue<Point> queue = new LinkedList<>();

queue.offer(new Point(0, 0));
visited[0][0] = true;

 

ํ๊ฐ€ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๋™์•ˆ ํ•ด๋‹น ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

๋จผ์ € ํ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด๊ณ  ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ๋‹ค์Œ 3๊ฐ€์ง€ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

 

1. ๋ฏธ๋กœ์˜ ํฌ๊ธฐ๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ

2. ๊ดด๋ฌผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ(1์ธ ๊ฒฝ์šฐ)

3. ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ

 

์ฆ‰, ๋ฏธ๋กœ์˜ ํฌ๊ธฐ๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ๊ดด๋ฌผ์ด ์—†๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋™ํ•œ๋‹ค.

while (!queue.isEmpty()) {
    Point point = queue.poll();
    int x = point.x;
    int y = point.y;

    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];

        if (nx < 0 || ny < 0 || nx >= N || ny >= M) {
            continue;
        }

        if (maze[nx][ny] == 0 || visited[nx][ny]) {
            continue;
        }

        queue.offer(new Point(nx, ny));
        visited[nx][ny] = true;
    }
}

 

๋™๋นˆ์ด๊ฐ€ ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์›€์ง์—ฌ์•ผ ํ•˜๋Š” ์ตœ์†Œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ ์ „์˜ ์นธ์—์„œ 1์”ฉ ๋”ํ•ด์ค€๋‹ค.

์ฆ‰ ์ฒ˜์Œ ์นธ์€ 1์ด๋ฏ€๋กœ ๊ทธ๋‹ค์Œ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•  ์นธ์€ 2, ์ด๋ ‡๊ฒŒ 1์”ฉ ๋”ํ•ด๊ฐ€๋ฉฐ ์ด๋™ํ•œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค.

maze[nx][ny] = maze[x][y] + 1;

 

์œ„์—์„œ ๋งํ–ˆ๋“  BFS๋Š” ์‹œ์ž‘ ์ง€์ ๋ถ€ํ„ฐ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ ์ง„ํ–‰ํ•˜๋‹ค ์ถœ๊ตฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ๊ฒƒ์ด ์ตœ์†Œ ์ด๋™ ์นธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์นธ์˜ ์ขŒํ‘œ์™€ ์ถœ๊ตฌ์˜ ์ขŒํ‘œ๊ฐ€ ์ผ์น˜ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ์นธ์—์„œ 1์„ ๋”ํ•˜์—ฌ count์— ์ €์žฅํ•œ ํ›„ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

if (nx == N - 1 && ny == M - 1) {
    count = maze[x][y] + 1;
    return;
}

 

์ตœ์ข… bfsํ•จ์ˆ˜

static void bfs() {
    Queue<Point> queue = new LinkedList<>();

    queue.offer(new Point(0, 0));
    visited[0][0] = true;

    while (!queue.isEmpty()) {
        Point point = queue.poll();
        int x = point.x;
        int y = point.y;

        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];

            if (nx < 0 || ny < 0 || nx >= N || ny >= M) {
                continue;
            }

            if (maze[nx][ny] == 0 || visited[nx][ny]) {
                continue;
            }

            if (nx == N - 1 && ny == M - 1) {
                count = maze[x][y] + 1;
                return;
            }

            queue.offer(new Point(nx, ny));
            visited[nx][ny] = true;
            maze[nx][ny] = maze[x][y] + 1;
        }
    }
}

 


๊ตฌํ˜„ ์ฝ”๋“œ

class Point {
    int x;
    int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class TC_5_2 {
    static int[][] maze;
    static boolean[][] visited;
    static int N, M;
    static int[] dx = {-1, 1, 0, 0};  // ์ƒํ•˜์ขŒ์šฐ
    static int[] dy = {0, 0, -1, 1};
    static int count = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        maze = new int[N][M];
        visited = new boolean[N][M];

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

        bfs();
        System.out.println(count);
    }

    static void bfs() {
        Queue<Point> queue = new LinkedList<>();

        queue.offer(new Point(0, 0));
        visited[0][0] = true;

        while (!queue.isEmpty()) {
            Point point = queue.poll();
            int x = point.x;
            int y = point.y;

            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];

                if (nx < 0 || ny < 0 || nx >= N || ny >= M) {
                    continue;
                }

                if (maze[nx][ny] == 0 || visited[nx][ny]) {
                    continue;
                }

                if (nx == N - 1 && ny == M - 1) {
                    count = maze[x][y] + 1;
                    return;
                }

                queue.offer(new Point(nx, ny));
                visited[nx][ny] = true;
                maze[nx][ny] = maze[x][y] + 1;
            }
        }
    }
}

 

Reference

์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค - ๋‚˜๋™๋นˆ

'๐ŸŽฏPS - Baekjoon, etc > BFS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿฅˆ[๋ฐฑ์ค€, 1260] DFS์™€ BFS (Java)  (0) 2023.04.18
๐Ÿฅ‡[๋ฐฑ์ค€, 7576] ํ† ๋งˆํ†  (Java)  (1) 2023.03.21

๋Œ“๊ธ€