๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 2667 ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ

by ๐ŸŠ๊ทค๐ŸŠ 2024. 8. 23.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/2667

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

์•„์ด๋””์–ด

  • ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ  ๊ฐ’์ด 1์ธ ์ขŒํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ BFS๋ฅผ ๋Œ๋ฆฐ๋‹ค.
  • BFS๋ฅผ ๋Œ๋ฆฌ๋ฉด์„œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ขŒํ‘œ๊ฐ’์ด 1์ธ ์ขŒํ‘œ๊ฐ’์„ ์ฐพ๊ณ  ์นด์šดํŠธ๋ฅผ ํ•ด์ค€ ํ›„, ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.
  • ๊ทธ๋ ‡๊ฒŒ BFS๋ฅผ ๋Œ๋ฆฌ๊ณ  Queue๊ฐ€ ๋น„๋ฉด ์นด์šดํŠธํ•œ ๋ณ€์ˆ˜๋ฅผ return ํ•ด์ค˜์„œ ArrayList์— ๋‹ด๋Š”๋‹ค (ํ•œ ๋‹จ์ง€์— ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜)
  • ๊ทธ๋ ‡๊ฒŒ ๋ฐฐ์—ด์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋Œ๋ฆฌ๋ฉด ๋‹จ์ง€๋งˆ๋‹ค ๋ช‡๋ช… ์žˆ๋Š”์ง€ ArrayList์— ์ €์žฅ์ด ๋˜๋Š”๋ฐ, ๊ทธ ArrayList๋ฅผ ์ •๋ ฌ ํ›„ ์ถœ๋ ฅํ•œ๋‹ค.

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • X

BFS๋Š” ์ด์ œ ๋‚˜๋ฆ„ ํ’€๋งŒ ํ• ์ง€๋„..? ใ…Žใ…Ž

์ฝ”๋“œ

import java.io.*;
import java.util.*;
import java.awt.*;

public class BOJ2667 {

    static int N;
    static int map[][];
    static boolean visited[][];
    static ArrayList<Integer> result;
    static int dx[] = {-1, 1, 0, 0};
    static int dy[] = {0, 0, -1, 1};

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // ํ–‰, ์—ด
        N = Integer.parseInt(br.readLine());
        // ์ง€๋„
        map = new int[N][N];
        // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
        visited = new boolean[N][N];
        // ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•  ArrayList
        result = new ArrayList<>();

        // ์ง€๋„ ์ž…๋ ฅ
        for(int i = 0; i < N; i++){
            String s = br.readLine();
            for(int j = 0; j < N; j++){
                int n = Integer.parseInt(s.split("")[j]);

                map[i][j] = n;
            }
        }

        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                // ๋งŒ์•ฝ ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ
                // ๊ฐ’์ด 1์ด๋ผ๋ฉด
                if(!visited[i][j] && (map[i][j] == 1)){
                    int cnt = BFS(i, j);

                    // returnํ•œ ์‚ฌ๋žŒ์ˆ˜๋ฅผ ArrayList์— ๋„ฃ์–ด์คŒ
                    result.add(cnt);
                }
            }
        }

        // ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
        Collections.sort(result);

        sb.append(result.size() + "\n");

        for(int i : result){
            sb.append(i + "\n");
        }

        System.out.println(sb);
    }

    public static int BFS(int x, int y){
        Queue<Point> q = new LinkedList<>();

        // ๋“ค์–ด์˜จ ์ขŒํ‘œ๊ฐ’์„ Queue์— ๋„ฃ์–ด์คŒ
        q.offer(new Point(x, y));

        // ํ•ด๋‹น ์ขŒํ‘œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited[x][y] = true;

        // ์‚ฌ๋žŒ ์ˆ˜
        int people = 1;

        // Queue๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€
        while(!q.isEmpty()){
            // Queue์— ์ €์žฅ๋œ ์ขŒํ‘œ๊ฐ’
            int xx = q.peek().x;
            int yy = q.peek().y;

            q.poll();

            // ๊บผ๋‚ธ ์ขŒํ‘œ ๊ธฐ์ค€์œผ๋กœ ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰
            for(int i = 0; i < 4; i++){
                // ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•œ ์ขŒํ‘œ๊ฐ’
                int nx = xx + dx[i];
                int ny = yy + dy[i];

                // ๋ฐฐ์—ด ๋ฒ”์œ„๊ฐ’์„ ๋ฒ—์–ด๋‚˜๋ฉด continue
                if(nx >= N || nx < 0 || ny >= N || ny < 0){
                    continue;
                }

                // ๋งŒ์•ฝ ์ด๋™ํ•œ ์ขŒํ‘œ๊ฐ’์„ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ 
                // ๊ฐ’์ด 1์ด๋ผ๋ฉด
                if(!visited[nx][ny] && (map[nx][ny] == 1)){
                    // ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ํ›„
                    visited[nx][ny] = true;
                    // ์‚ฌ๋žŒ ์ˆ˜ + 1์„ ํ•˜๊ณ 
                    people = people + 1;
                    // Queue์— ํ•ด๋‹น ์ขŒํ‘œ๊ฐ’์„ ๋„ฃ์–ด์คŒ
                    q.offer(new Point(nx, ny));
                }
            }
        }

        // ์นด์šดํŠธํ•œ ์‚ฌ๋žŒ ์ˆ˜ return
        return people;
    }
}