๊ธฐ๋ก๋ฐฉ

BOJ_2146 : ๋‹ค๋ฆฌ ๋งŒ๋“ค๊ธฐ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_2146 : ๋‹ค๋ฆฌ ๋งŒ๋“ค๊ธฐ

Soom_1n 2024. 5. 29. 00:11

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



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

  • N x N ์ง€๋„์— 2๊ฐœ ์ด์ƒ์˜ ์„ฌ์ด ์ฃผ์–ด์ง„๋‹ค. ์„ฌ์€ 1๋กœ ์ƒํ•˜์ขŒ์šฐ ์—ฐ๊ฒฐ๋œ ๋ฉ์–ด๋ฆฌ์ด๋‹ค.
  • ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์„ฌ ์‚ฌ์ด์— ๋‹ค๋ฆฌ ํ•˜๋‚˜๋ฅผ ๋†“์„ ๋•Œ, ๋‹ค๋ฆฌ์˜ ๊ธธ์ด์˜ ์ตœ์†Œ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

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

  • ๋‹จ์ˆœํ•œ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ์ด๋‹ค.
  • ๋จผ์ € ์ง€๋„ ์ƒ์˜ ๊ฐ™์€ ์„ฌ ์†Œ์† 1๋“ค์„ ๋ฌถ์–ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
    • ๋‹ค๋ฆฌ๋ฅผ ์ง€์„ ๋•Œ, ์„œ๋กœ ๋‹ค๋ฅธ ์„ฌ์ธ์ง€ ์•Œ์•„์•ผ ํ•˜๋ฏ€๋กœ ์„ฌ ๋ฉ์–ด๋ฆฌ ๋ณ„ ๋‹ค๋ฅธ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
    • ๋‹จ์ˆœํ•œ 4๋ฐฉ ํƒ์ƒ‰์ด๋ฏ€๋กœ, DFS๋‚˜ BFS ์ƒ๊ด€ ์—†์ด ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” DFS๋กœ ํ†ต์ผํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • ์„ฌ ์‚ฌ์ด์— ๋‹ค๋ฆฌ๊ฐ€ ๋†“์ด๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
    • DFS๋กœ ํ•œ์ชฝ ์„ฌ์˜ ๋์—์„œ ๋‹ค๋ฅธ ์„ฌ์„ ๋ฐœ๊ฒฌ ํ•  ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰ํ•œ๋‹ค.
    • ํ•œ๋ฒˆ ๋‹ค๋ฆฌ๊ฐ€ ์™„์„ฑ๋˜๋ฉด, ์ตœ์†Œ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๋ฐฑํŠธ๋ž˜ํ‚น์— ์ด์šฉํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

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

public class Main {
    private static final int[] dx = {-1, 0, 1, 0};
    private static final int[] dy = {0, 1, 0, -1};
    private static int min;
    private static int[][] map;
    private static int[][] visited;

    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;

        int N = Integer.parseInt(br.readLine());
        map = new int[N][N];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        // ์„ฌ ๋ฌถ๊ธฐ
        int cnt = 0; // ์„ฌ์˜ ๊ฐฏ์ˆ˜
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][j] == 1) {
                    dfs_island(i, j, ++cnt + 1);
                }
            }
        }

        // ๋‹ค๋ฆฌ ์ง“๊ธฐ
        min = Integer.MAX_VALUE;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][j] > 1) {
                    visited = new int[N][N];
                    for (int k = 0; k < N; k++) {
                        for (int l = 0; l < N; l++) {
                            visited[k][l] = Integer.MAX_VALUE;
                        }
                    }
                    dfs_bridge(i, j, map[i][j], 0);
                }
            }
        }

        // Output
        bw.write(Integer.toString(min));
        bw.flush();
    }

    private static void dfs_bridge(int row, int col, int num, int depth) {
        visited[row][col] = depth;

        if (depth >= min)
            return;

        for (int i = 0; i < 4; i++) {
            int r = row + dx[i];
            int c = col + dy[i];
            if (0 <= r && r < map.length && 0 <= c && c < map.length && visited[r][c] > depth + 1 && map[r][c] != num) {
                if (map[r][c] == 0) {
                    dfs_bridge(r, c, num, depth + 1);
                } else {
                    min = Math.min(min, depth);
                    return;
                }
            }
        }
    }

    private static void dfs_island(int row, int col, int iNum) {
        map[row][col] = iNum;

        for (int k = 0; k < dx.length; k++) {
            int r = row + dx[k];
            int c = col + dy[k];
            if (0 <= r && r < map.length && 0 <= c && c < map.length && map[r][c] == 1) {
                dfs_island(r, c, iNum);
            }
        }
    }
}

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

  • dfs_island() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด dfs๋กœ ์ธ์ ‘ํ•œ 1๋“ค์„ ๋ฌถ์–ด ์„ฌ ๋ฉ์–ด๋ฆฌ๋ฅผ ํ‘œ์‹œํ–ˆ๋‹ค.
  • dfs_bridge() ๋ฉ”์„œ๋“œ์—์„œ dfs ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฆฌ๋ฅผ ๊ทธ๋ ค๊ฐ€๋ฉฐ ์ตœ์†Œ๊ฐ’์„ ์ฐพ์•˜๋‹ค.
    • ์ตœ์†Œ๊ฐ’์„ min์— ์ €์žฅํ•˜๊ณ  ํ•ด๋‹น ๊ธธ์ด๋Š” ๋” ๋ณด์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ, ์ฆ‰์‹œ returnํ•œ๋‹ค.
    • ์ตœ์†Œ๊ฐ’์„ ์ฐพ์€ ํ›„์—๋Š” ํ•ด๋‹น ๊ฐ’์œผ๋กœ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ๊ฒฝ๊ณ„๊ฐ’(minimum)์—์„œ 2ํšŒ ํ‹€๋ ธ๋‹ค.
    • N์ด 100์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ง€๋งŒ, ํ•ญ์ƒ ์„ฌ์ด 2๊ฐœ์ด์ƒ ์กด์žฌํ•œ๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ N์˜ ์ตœ์†Œ๊ฐ’์€ 2์ด๋‹ค.
    • dfs_island() ๋ฉ”์„œ๋“œ์—์„œ map[row][col] = iNum ์œผ๋กœ ๊ฐ’์„ ๋„ฃ๋Š” ๋ถ€๋ถ„์„ 4๋ฐฉํƒ์ƒ‰ if๋ฌธ ์•ˆ์— ๋„ฃ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ฐ€ N์ด 2์ผ๋•Œ ํ‹€๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‹ค.
    • ์‹œ์ž‘ ์œ„์น˜๋งŒ ๊ฐ’์ด ์”Œ์ด์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋Š” ๋‹จ์ˆœํ•œ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด์—ˆ๋Š”๋ฐ, ๋ฌธ์ œ ํƒœ๊ทธ์—๋Š” BFS๋งŒ ์ ํ˜€์žˆ์–ด์„œ ๋†€๋ž๋‹ค. ํ™•์‹คํžˆ ๋‹ค๋ฆฌ๋ฅผ ์ง“๋Š”๊ฑด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— BFS๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด์•ผ ํ–ˆ์ง€๋งŒ, ๋ฌธ์ œ ์กฐ๊ฑด์ด ๊นŒ๋‹ค๋กญ์ง€ ์•Š์•„์„œ DFS + ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ํ’€์ด๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •๋ฆฌํ–ˆ๋‹ค.
728x90