๊ธฐ๋ก๋ฐฉ

BOJ_1261 : ์•Œ๊ณ ์ŠคํŒŸ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1261 : ์•Œ๊ณ ์ŠคํŒŸ

Soom_1n 2024. 5. 10. 03:02

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • N*M ๋ฏธ๋กœ์—์„œ (1, 1) ๋ถ€ํ„ฐ (N, M) ๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
  • ๋ฏธ๋กœ๋Š” ๋นˆ ๋ฐฉ๊ณผ ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๋ฒฝ์„ ๋ถ€์ˆ˜๋Š”๋ฐ ๋น„์šฉ์ด 1 ์†Œ๋ชจ๋œ๋‹ค.

๐Ÿ”ธ ๋ฌธ์ œ ํ’€์ด ๐Ÿ”ธ

  • ๊ฐ€์ค‘์น˜๊ฐ€ 0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ์†Œ ๋น„์šฉ ํ˜น์€ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ’€์ด์—์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.
    • ๋‹ค์ต์ŠคํŠธ๋ผ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(E log V) ์ด๋‹ค.
    • ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•ด ๊ฐ€๋ฉฐ, ๊ฐ€์ค‘์น˜๊ฐ€ ๋” ์ ์€ ๊ฒฝ๋กœ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๊ฐ€์ค‘์น˜๊ฐ€ 0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒฝ์šฐ์— 0-1 BFS๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋” ํšจ์œจ์ ์œผ๋กœ ํ’€์ดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • 0-1 BFS์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(V + E) ์ด๋‹ค.
    • ๋ชจ๋“  ๋…ธ๋“œ์™€ ๊ฒฝ๋กœ๋ฅผ 1๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธํ•œ๋‹ค.
    • ํ ๋Œ€์‹  ๋ฑ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ฐ€์ค‘์น˜๊ฐ€ 0์ธ ๊ฒฝ์šฐ๋Š” front, ๊ฐ€์ค‘์น˜๊ฐ€ 1์ธ ๊ฒฝ์šฐ๋Š” back์— ์‚ฝ์ž…ํ•œ๋‹ค.
    • ๋ฑ์˜ front ๋ถ€ํ„ฐ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด ํƒ์ƒ‰ํ•˜๋ฉฐ, ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์ƒ๊ธด๋‹ค.

๐Ÿ”ธ ๊ธฐ์กด ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.*;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

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

        boolean[][] map = new boolean[N][M]; // ๋งต ์ •๋ณด
        int[][] visited = new int[N][M]; // ๋ฐฉ๋ฌธ์‹œ ๋ถ€์ˆœ ๋ฒฝ์˜ ๊ฐฏ์ˆ˜ ์ตœ์†Œ๊ฐ’

        for (int i = 0; i < N; i++) {

            char[] chars = br.readLine().toCharArray();

            for (int j = 0; j < M; j++) {
                map[i][j] = chars[j] == '0'; // ๋ฒฝ์€ false
                visited[i][j] = Integer.MAX_VALUE; // ๋ถ€์ˆœ ๋ฒฝ ๊ฐฏ์ˆ˜ ์ดˆ๊ธฐํ™”
            }
        }

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

        Queue<AOJ> que = new ArrayDeque<>();
        que.add(new AOJ(0, 0, 0));
        visited[0][0] = 0;

        int answer = Integer.MAX_VALUE;

        while (!que.isEmpty()) {
            AOJ aoj = que.poll();

            if (aoj.row == N - 1 && aoj.col == M - 1) {
                answer = Math.min(answer, aoj.broken);
            } else {
                for (int i = 0; i < 4; i++) {
                    int r = aoj.row + dx[i];
                    int c = aoj.col + dy[i];
                    if (0 <= r && r < N && 0 <= c && c < M) {
                        if (map[r][c] && visited[r][c] > aoj.broken) {
                            visited[r][c] = aoj.broken;
                            que.add(new AOJ(r, c, aoj.broken));
                        } else if (visited[r][c] > aoj.broken + 1) {
                            visited[r][c] = aoj.broken + 1;
                            que.add(new AOJ(r, c, visited[r][c]));
                        }
                    }
                }
            }
        }

        // Output
        bw.write(Integer.toString(visited[N - 1][M - 1]));
        bw.flush();
    }

    public static class AOJ {
        int row, col, broken;

        public AOJ(int row, int col, int broken) {
            this.row = row;
            this.col = col;
            this.broken = broken;
        }
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • BFS ํ˜•์‹์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์ €์žฅ๋œ ๋น„์šฉ์˜ ๊ฐฑ์‹ ์ด ์ผ์–ด๋‚˜๋ฉด ๋‹ค์‹œ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋˜์—ˆ๋‹ค.
  • ๋ฐฉ๊ณผ ๋ฒฝ ์ •๋ณด๋Š” boolean ์ด์ค‘๋ฐฐ์—ด map์œผ๋กœ, ์ตœ์†Œ ๋น„์šฉ์„ ์ €์žฅ์€ intํ˜• ์ด์ค‘๋ฐฐ์—ด visited๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • ํ๊ฐ€ ๋ชจ๋‘ ๋นŒ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฏ€๋กœ, answer์€ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค.

 

๐Ÿ”ธ 0-1 BFS ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

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

        int[][] map = new int[N][M]; // ๋งต ์ •๋ณด

        for (int i = 0; i < N; i++) {

            char[] chars = br.readLine().toCharArray();

            for (int j = 0; j < M; j++) {
                map[i][j] = Character.getNumericValue(chars[j]);
            }
        }

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

        Deque<AOJ> dq = new ArrayDeque<>();
        dq.addFirst(new AOJ(0, 0, 0));

        while (!dq.isEmpty()) {
            AOJ aoj = dq.pollFirst();

            if (aoj.row == N - 1 && aoj.col == M - 1) { // Output
                bw.write(Integer.toString(aoj.broken));
                bw.flush();
                break;
            } else {
                for (int i = 0; i < 4; i++) {
                    int r = aoj.row + dx[i];
                    int c = aoj.col + dy[i];
                    if (0 <= r && r < N && 0 <= c && c < M) {
                        if (map[r][c] == 0) {
                            dq.addFirst(new AOJ(r, c, aoj.broken));
                        } else if (map[r][c] == 1) {
                            dq.addLast(new AOJ(r, c, aoj.broken + 1));
                        }
                        map[r][c] = -1; // ๋ฐฉ๋ฌธ์ฒดํฌ
                    }
                }
            }
        }
    }

    public static class AOJ {
        int row, col, broken;

        public AOJ(int row, int col, int broken) {
            this.row = row;
            this.col = col;
            this.broken = broken;
        }
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ๊ธฐ์กด ๋‹ค์ต์ŠคํŠธ๋ผ ํ’€์ด ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด์„œ 0-1 BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•œ ํ’€์ด์ด๋‹ค.
  • ๊ฐ€์ค‘์น˜๊ฐ€ 0์ด๋ฉด front, 1์ด๋ฉด back์— ์‚ฝ์ž…ํ•œ๋‹ค.
  • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” 4๋ฐฉ ํƒ์ƒ‰์—์„œ ์ œ์™ธํ•˜๊ธฐ ์œ„ํ•ด ๋งต ์ •๋ณด๋ฅผ -1๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ ธ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  •  ์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” N x M ํ˜•ํƒœ์˜ ๋งต์ด์—ฌ์„œ ๋‹จ์ˆœ BFS ์ตœ์ ํ™” ์ธ ์ค„ ์•Œ์•˜๋‹ค.
    • ๋‹ค์‹œ๋ณด๋‹ˆ 2์ฐจ์› ๋ฐฐ์—ด์—์„œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉ ํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.
    • ์‚ฌ์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์ œ๋Œ€๋กœ ์ธ์ง€๋ฅผ ๋ชปํ–ˆ๋‹ค๋‹ˆ... ๋ฐ˜์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋ฌธ์ œ๋ฅผ ๋งž์ถ˜ ์ดํ›„์— ํƒœ๊ทธ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ 0-1 BFS๊ฐ€ ์žˆ๊ธธ๋ž˜ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.
    • ์–ธ์ œ ๋ณธ์ ์ด ์žˆ๋˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ ์–ด๋ ต์ง€ ์•Š์œผ๋ฉด์„œ ์œ ์šฉํ•ด์„œ ๋ฐ”๋กœ ํฌ์ŠคํŒ… ์ •๋ฆฌํ•˜๊ณ , ์ ์šฉํ•ด์„œ ์žฌํ’€์ด ํ–ˆ๋‹ค.
    • 0,1 ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ๋‹ค์ต์ŠคํŠธ๋ผ ๋ณด๋‹ค ์ข‹์€ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋‚˜์˜จ๋‹ค๊ณ  ์•Œ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ํ™•์‹คํžˆ ์‹œ๊ฐ„์ด ์ค„์–ด๋“  ๋ชจ์Šต์ด๋‹ค.
728x90