๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€ 2178๋ฒˆ ๋ฏธ๋กœ ํƒ์ƒ‰ ์ž๋ฐ” ๋ฌธ์ œํ’€์ด

by Wonit 2021. 2. 11.

๋ฌธ์ œ

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๋ฐฑ์ค€์˜ 2178๋ฒˆ ๋ฏธ๋กœ ํƒ์ƒ‰ ์˜ ์ ‘๊ทผ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.
์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

๋ฌธ์ œ ์ ‘๊ทผ

๋ฌธ์ œ๋ฅผ ์ฝ์œผ๋ฉฐ ๋ฐ”๋กœ ํŒŒ์•…ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ตœ์†Œ์˜๋ผ๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋Š” Dfs์™€ Bfs ๋ชจ๋‘ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.
ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” BFS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

 

์—ฌ๊ธฐ์„œ DFS๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ, ์šด์ด ๋‚˜์˜๊ฒŒ DFS์—์„œ ์ฒ˜์Œ์œผ๋กœ ์„ ํƒํ•œ ๋…ธ๋“œ๊ฐ€ 6์ด๋ผ๊ณ  ํ•ด๋ณด์ž.

๊ทธ๋Ÿผ ์‹ค์ œ๋กœ ์ฐพ๋Š” ๋…ธ๋“œ๋Š” ๋ฐ”๋กœ ํ•œ์นธ ์•ž์— ์žˆ์ง€๋งŒ, DFS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด 6์˜ ๋ ๊นŒ์ง€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ, ๊ฒฝ๋กœ๋ฌธ์ œ๋Š” BFS๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์–ด์•ผ ํ•œ๋‹ค.

ํ•ด๊ฒฐ๋ฒ•

์ด๋ฒˆ ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ๋ฐ”๋กœ ์นธ์˜ ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋งŒ์•ฝ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฏธ๋กœ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0

๊ทธ๋Ÿผ ์™ผ์ชฝ ์ œ์ผ ์•„๋ž˜๋กœ ๊ฐ€๋ ค๋ฉด ๋ช‡ ์นธ์„ ์ด๋™ํ•ด์•ผ ํ• ๊นŒ?

 

๊ทธ๋ ‡๋‹ค 4์นธ์ด๋‹ค.

 

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ์ฝ”๋”ฉ์„ ํ•ด์•ผ 4์นธ์ด ๋‚˜์˜ฌ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

 

BFS์—์„œ ํ์— ์ขŒํ‘œ๋ฅผ ๋„ฃ์„ ๋•Œ?


BFS์—์„œ ํ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋บ„ ๋•Œ?

ํƒ์ƒ‰ํ•  ๋•Œ, ๋‹ค์Œ์— ๋ฐŸ์„ ์นธ์— ํ˜„์žฌ ์นธ๊นŒ์ง€์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์•ฝ๊ฐ„์˜ DP ์Šค๋Ÿฌ์šด ๋…ผ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์กฐ๊ธˆ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™๋‹ค.

1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0

์•„๋งˆ ์ด๋ ‡๊ฒŒ ๋˜์ง€ ์•Š์„๊นŒ?

 

์‹ค์ œ๋กœ ์ฝ”๋“œ ์ƒ์—์„œ๋Š” ์•„๋งˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋  ๊ฒƒ์ด๋‹ค.

graph[๋‹ค์Œ ์นธ.y][๋‹ค์Œ ์นธ.x] = graph[์ด์ „ ์นธ.y][์ด์ „ ์นธ.x] + 1;

์ด๋ ‡๊ฒŒ ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์‹œ๋กœ ๋ฐ›์•˜๋˜ ๋ฐฐ์—ด์€ ์•„๋งˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋  ๊ฒƒ์ด๋‹ค.

4 6 (๋ณ€ํ™˜ ์ „)        4 6 (๋ณ€ํ™˜ ํ›„)
1 0 1 1 1 1        1 0 9 10 11 12
1 0 1 0 1 0        2 0 8  0 12  0
1 0 1 0 1 1        3 0 7  0 13 14
1 1 1 0 1 1        4 5 6  0 14 15

๋˜ํ•œ visited[][] ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐฐ์—ด์„ ํ†ตํ•ด์„œ ์ค‘๋ณต๋œ ๋ฐฉ๋ฌธ์„ ํ•˜์ง€ ์•Š๋„๋ก ํ•ด์ฃผ์ž.

์ •๋‹ต ์ฝ”๋“œ

import java.io.*;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class Main {

    static int n, m;
    static int[][] graph;
    static boolean[][] visited;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] nm = br.readLine().split(" ");
        n = Integer.parseInt(nm[0]);
        m = Integer.parseInt(nm[1]);

        graph = new int[n + 1][m + 1];
        visited = new boolean[n + 1][m + 1];

        for (int i = 1; i <= n; i++) {
            String[] line = br.readLine().split("");
            for (int j = 1; j <= m; j++) {
                graph[i][j] = Integer.parseInt(line[j-1]);
            }
        }

        int[] dx = {1, 0, -1, 0};
        int[] dy = {0, 1, 0, -1};

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

        queue.add(new MazePoint(1, 1));
        visited[1][1] = true;
        while(!queue.isEmpty()) {
            MazePoint point = queue.remove();
            for (int i = 0; i < dx.length; i++) {
                int xx = point.x + dx[i];
                int yy = point.y + dy[i];
                if(xx > 0 && yy > 0 && xx <= m && yy <= n) {
                    if(graph[yy][xx] != 0 && !visited[yy][xx]) {
                        visited[yy][xx] = true;
                        graph[yy][xx] = graph[point.y][point.x] + 1;
                        queue.add(new MazePoint(xx, yy));
                    }
                }
            }
        }
        bw.write(String.valueOf(graph[n][m]));
        bw.flush();
        bw.close();
}
}

class MazePoint {
    int x;
    int y;
    MazePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

๋ฌธ์ œ ํšŒ๊ณ 

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ๋ฐ”๋กœ ์•ž ๋ฌธ์ œ์ธ ํ† ๋งˆํ† ์—์„œ ๋„ˆ๋ฌด ์ง„์„ ๋นผ์„œ์ธ์ง€ ์ˆ ์ˆ  ํ’€๋ ธ๋˜ ๋ฌธ์ œ์ด๋‹ค.
ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ StackOverFlow ์—๋Ÿฌ๋ฅผ ํ•œ ๋ฒˆ ๋งˆ์ฃผํ–ˆ๊ณ , ํ๋ฅผ ์ด์šฉํ•  ๋•Œ ๊ผผ๊ผผํžˆ enqueue ์กฐ๊ฑด์„ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ๋˜ ๋‚˜๋ฅผ ์žก์•˜๋‹ค.
๋จธ๋ฆฌ์†์— ์—ผ๋‘ํ•ด๋‘๊ณ  ํ’€๊ณ  ์žˆ์œผ๋ฉด์„œ๋„ ๋นจ๋ฆฌ ์‹คํ–‰์‹œ์ผœ๋ณด๋ ค๋Š” ๊ทธ ์ƒ๊ฐ ๋•Œ๋ฌธ์— ๋” ์‹ค์ˆ˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
๋˜ํ•œ ์ด๋Ÿฐ x, y ์ขŒํ‘œ ๋ฌธ์ œ์—์„œ x, y๋ฅผ ๋ฐฐ์—ด๋กœ ์˜ฎ๊ธด๋‹ค๋ฉด arr[x][y]๊ฐ€ ์•„๋‹ˆ๋ผ arr[y][x] ์ธ ๊ฒƒ์„ ๋˜ ๊นŒ๋จน์—ˆ๋‹ค.
์•ž์œผ๋กœ๋„ ์ด๋Ÿฐ ์‹ค์ˆ˜๋ฅผ ํ•˜์ง€ ์•Š๊ฒŒ ๋” ๋”๋”๋”๋”๋”๋”๋”๋”๋”๋” ์—ผ๋‘ํ•ด์•ผ๊ฒ ๋‹ค.

์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€