๊ธฐ๋ก๋ฐฉ

BOJ_2638 : ์น˜์ฆˆ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_2638 : ์น˜์ฆˆ

Soom_1n 2024. 1. 25. 12:59

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

 

2638๋ฒˆ: ์น˜์ฆˆ

์ฒซ์งธ ์ค„์—๋Š” ๋ชจ๋ˆˆ์ข…์ด์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ๊ฐœ์˜ ์ •์ˆ˜ N, M (5 ≤ N, M ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๋ชจ๋ˆˆ์ข…์ด ์œ„์˜ ๊ฒฉ์ž์— ์น˜์ฆˆ๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„์€ 1๋กœ ํ‘œ์‹œ๋˜๊ณ , ์น˜์ฆˆ๊ฐ€ ์—†๋Š” ๋ถ€๋ถ„์€ 0์œผ๋กœ

www.acmicpc.net



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

  • N x M ๋ชจ๋ˆˆ์ข…์ด์— ๊ณต๊ธฐ์™€ ์น˜์ฆˆ๊ฐ€ 0, 1 ๋กœ ์ฃผ์–ด์ง„๋‹ค.
  • ์™ธ๋ถ€ ๊ณต๊ธฐ์™€ 2๊ฐœ ์ด์ƒ ๋งž๋‹ฟ์€ ์น˜์ฆˆ๋Š” ๋…น๋Š”๋‹ค.
  • ์น˜์ฆˆ๊ฐ€ ๋ชจ๋‘ ๋…น๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๊ตฌํ•œ๋‹ค.

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

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

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

import java.io.*;
import java.util.ArrayDeque;
import java.util.Queue;
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 N, M, map[][];

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

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        map = new int[N][M];

        Queue<Point> que = new ArrayDeque<>();

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
                if (map[i][j] == 1) que.add(new Point(i, j));
            }
        }

        air_dfs(0, 0);

        int answer = 0;

        while (!que.isEmpty()) {
            int size = que.size();

            for (int i = 0; i < size; i++) {
                Point point = que.poll();
                int cnt = 0;
                for (int j = 0; j < 4; j++) {
                    int row = point.r + dx[j];
                    int col = point.c + dy[j];
                    if (0 <= row && row < N && 0 <= col && col < M && map[row][col] == 2) {
                        cnt++;
                    }
                }
                if (cnt > 1) {
                    map[point.r][point.c] = 0;
                } else {
                    que.add(point);
                }
            }

            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if (map[i][j] == 2)
                        air_dfs(i, j);
                }
            }
            answer++;
        }

        bw.write(Integer.toString(answer));
        bw.flush();
    }

    private static void air_dfs(int r, int c) {
        map[r][c] = 2;

        for (int i = 0; i < 4; i++) {
            int row = r + dx[i];
            int col = c + dy[i];
            if (0 <= row && row < N && 0 <= col && col < M && map[row][col] == 0) {
                air_dfs(row, col);
            }
        }
    }

    private static class Point {
        int r, c;

        public Point(int r, int c) {
            this.r = r;
            this.c = c;
        }
    }
}

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

  • ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค Point๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ๋‹ค.
  • DFS๋กœ ์™ธ๋ถ€๊ณต๊ธฐ์™€ ๋ฐ€์ ‘ํ•œ ๊ณต๊ธฐ๋“ค์„ 0์—์„œ 2๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ air_dfs()๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ๋‹ค.
  • ๊ฐ™์€ ์‹œ๊ฐ„์— ๋…น์€ ์น˜์ฆˆ๋ฅผ ํ๋ฅผ ์ด์šฉํ•ด ํŒ๋ณ„ํ•œ๋‹ค.
    • ์ธ์ ‘ํ•œ ์™ธ๋ถ€๊ณต๊ธฐ๊ฐ€ 2๊ฐœ ์ด์ƒ์ธ ์น˜์ฆˆ๋Š” ๊ณต๊ธฐ(0) ์œผ๋กœ ๋งŒ๋“ ๋‹ค.
    • 2๊ฐœ ๋ฏธ๋งŒ์ด๋ผ๋ฉด, ์น˜์ฆˆ ์ƒํƒœ์ด๋ฏ€๋กœ ํ์— ๋‹ค์‹œ ๋„ฃ๋Š”๋‹ค.
    • ์™ธ๋ถ€ ๊ณต๊ธฐ(2)์™€ ์ธ์ ‘ํ•œ ๊ณต๊ธฐ(0)์„ air_dfs() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ชจ๋‘ 2๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
    • ์น˜์ฆˆ๊ฐ€ ๋ชจ๋‘ ์—†์–ด์งˆ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ์น˜์ฆˆ๊ฐ€ ๋ชจ๋‘ ๋…น๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ์นด์šดํŠธํ•œ ๋ณ€์ˆ˜ answer๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ๊ณจ๋“œ 3์น˜๊ณ ๋Š” ๊ฐ„๋‹จํ•œ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ์˜€๋‹ค.
    • ๊ณต๊ธฐ ํƒ์ƒ‰์€ ๋ญ๋“  ์ƒ๊ด€ ์—†์„ ๊ฒƒ ๊ฐ™์•„์„œ, ๊ตฌํ˜„์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•œ DFS๋ฅผ ์ด์šฉํ–ˆ๋‹ค.
    • ๋…น์€ ์น˜์ฆˆ ๊ด€๋ฆฌ๋Š” BFS๋ฅผ ์จ์•ผ ํ•  ์ค„ ์•Œ์•˜๋Š”๋ฐ, ๊ทธ๋ƒฅ ํ๋ฅผ ์ด์šฉํ•˜๋Š” ๋Š๋‚Œ์ด์—ˆ๋‹ค.
  • ์ธ์ ‘ ๊ณต๊ธฐ 0์„ ์™ธ๋ถ€ ๊ณต๊ธฐ 2๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ถ€๋ถ„์—์„œ 0์„ ์ฐพ์œผ๋ฉด ๋ฐ”๋กœ 2๋กœ ๋ฐ”๊พธ๋„๋ก ํ–ˆ๋Š”๋ฐ, ์น˜์ฆˆ ์† ๊ณต๊ธฐ๊นŒ์ง€ ๋ณ€ํ•ด์„œ ํ‹€๋ ธ๋‹ค.
    • 2๋ฅผ ์ฐพ์•„์„œ ์ธ์ ‘ 0์„ ์ฐพ์•„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์™ธ๋ถ€ ๊ณต๊ธฐ์™€ ์ธ์ ‘ํ•œ 0์„ ์ฐพ์•„ ๋ฐ”๊ฟ”์„œ ๋งž์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

728x90