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

[Java] BOJ 2606 ๋ฐ”์ด๋Ÿฌ์Šค

by ๐ŸŠ๊ทค๐ŸŠ 2024. 7. 27.

๋ฌธ์ œ 

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

  • ์‹ ์ข… ๋ฐ”์ด๋Ÿฌ์Šค์ธ ์›œ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „ํŒŒ๋œ๋‹ค.
  • ํ•œ ์ปดํ“จํ„ฐ๊ฐ€ ์›œ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ฆฌ๋ฉด ๊ทธ ์ปดํ“จํ„ฐ์™€ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์ปดํ“จํ„ฐ๋Š” ์›œ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด 7๋Œ€์˜ ์ปดํ“จํ„ฐ๊ฐ€ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. 1๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ ์›œ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ฆฌ๋ฉด ์›œ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” 2๋ฒˆ๊ณผ 5๋ฒˆ ์ปดํ“จํ„ฐ๋ฅผ ๊ฑฐ์ณ 3๋ฒˆ๊ณผ 6๋ฒˆ ์ปดํ“จํ„ฐ๊นŒ์ง€ ์ „ํŒŒ๋˜์–ด 2, 3, 5, 6 ๋„ค ๋Œ€์˜ ์ปดํ“จํ„ฐ๋Š” ์›œ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ 4๋ฒˆ๊ณผ 7๋ฒˆ ์ปดํ“จํ„ฐ๋Š” 1๋ฒˆ ์ปดํ“จํ„ฐ์™€ ๋„คํŠธ์›Œํฌ์ƒ์—์„œ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
  • ์–ด๋Š ๋‚  1๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ ์›œ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ ธ๋‹ค. ์ปดํ“จํ„ฐ์˜ ์ˆ˜์™€ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, 1๋ฒˆ ์ปดํ“จํ„ฐ๋ฅผ ํ†ตํ•ด ์›œ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๋Š” ์ปดํ“จํ„ฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
  • ์ฒซ์งธ ์ค„์—๋Š” ์ปดํ“จํ„ฐ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • ์ปดํ“จํ„ฐ์˜ ์ˆ˜๋Š” 100 ์ดํ•˜์ธ ์–‘์˜ ์ •์ˆ˜์ด๊ณ  ๊ฐ ์ปดํ“จํ„ฐ์—๋Š” 1๋ฒˆ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„๋‹ค.
  • ๋‘˜์งธ ์ค„์—๋Š” ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ ์Œ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด์–ด์„œ ๊ทธ ์ˆ˜๋งŒํผ ํ•œ ์ค„์— ํ•œ ์Œ์”ฉ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ ๋ฒˆํ˜ธ ์Œ์ด ์ฃผ์–ด์ง„๋‹ค.
  • 1๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ ์›œ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ ธ์„ ๋•Œ, 1๋ฒˆ ์ปดํ“จํ„ฐ๋ฅผ ํ†ตํ•ด ์›œ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๋Š” ์ปดํ“จํ„ฐ์˜ ์ˆ˜๋ฅผ ์ฒซ์งธ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค.

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

  • HashSet ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๊ทธ ๋ฐฐ์—ด์— ์ปดํ“จํ„ฐ ์—ฐ๊ฒฐ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. (HashSet์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ปดํ“จํ„ฐ ๋ฒˆํ˜ธ๋ฅผ ์ค‘๋ณต ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.)
  • ๊ทธ๋ฆฌ๊ณ  N+1 ํฌ๊ธฐ์˜ boolean ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•œ๋‹ค. 
  • ์šฐ์„  ์ปดํ“จํ„ฐ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ, [a]๋ฐฐ์—ด์— b๋ฅผ ์ €์žฅํ•˜๊ณ  [b]๋ฐฐ์—ด์— a๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  BFS๋ฅผ ๋Œ๋ฆฐ๋‹ค. 
  • Queue์— ์ฒ˜์Œ์— ์ฐพ์„ ์ปดํ“จํ„ฐ ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ๊ณ  ํ•ด๋‹น ๋ฒˆํ˜ธ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  while๋ฌธ์„ Queue๊ฐ€ ๋น„์–ด์งˆ๋•Œ๊นŒ์ง€ ๋Œ๋ฉด์„œ Queue์—์„œ ๋งจ ์œ„์˜ ๊ฐ’์„ ๋นผ๊ณ  ํ•ด๋‹น ๊ฐ’์„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ArrayList์— ์ €์žฅํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฒˆํ˜ธ์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์ปดํ“จํ„ฐ ๋ฒˆํ˜ธ๋“ค ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋ฒˆํ˜ธ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•˜๊ณ  Queue์— ๊ทธ ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ๋Š”๋‹ค.
  • ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋‹ค๋ณด๋ฉด ์ฒ˜์Œ์— ์ฐพ์„ ์ปดํ“จํ„ฐ ๋ฒˆํ˜ธ์™€ ์—ฐ๊ฒฐ๋œ ๋ฒˆํ˜ธ๋“ค์ด Queue์— ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ArrayList์— ์ €์žฅ๋œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ• ๋•Œ, ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ArrayList์—์„œ 1์„ ๋นผ๊ณ  ์ถœ๋ ฅํ•œ๋‹ค. (ํ•ด๋‹น ArrayList์— ์ดˆ๊ธฐ ์ปดํ“จํ„ฐ ๋ฒˆํ˜ธ๋„ ์ €์žฅ์ด ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ, ๋ณธ์ธ ๋ฒˆํ˜ธ๋Š” ๋นผ์•ผ๋˜๊ธฐ ๋•Œ๋ฌธ)

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

  • ์˜ค๋žœ๋งŒ์— BFS๋ฅผ ์จ์„œ ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.... (์•ž์œผ๋กœ ๋‚˜์˜ฌ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋“ค... ๊ธด์žฅ๋œ๋‹ค... ใ…œใ…œ)

ํŒŒ์ดํŒ…!!! ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋“ค...!! ๊ธฐ๋‹ค๋ ค๋ผ!!!

์ฝ”๋“œ

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

public class BOJ2606 {
    static Set<Integer> worm[];
    static Set<Integer> result;
    static boolean visited[];

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

        // ์ปดํ“จํ„ฐ ๊ฐœ์ˆ˜
        int N = Integer.parseInt(br.readLine());

        // ์ปดํ“จํ„ฐ ์Œ์˜ ์ˆ˜
        int C = Integer.parseInt(br.readLine());

        // ์ปดํ“จํ„ฐ ์—ฐ๊ฒฐ ์ €์žฅํ•  HashSet ๋ฐฐ์—ด
        worm = new HashSet[N + 1];

        // HashSet์œผ๋กœ ์ดˆ๊ธฐํ™”
        for (int i = 0; i <= N; i++) {
            worm[i] = new HashSet<>();
        }
        // ๊ฒฐ๊ณผ ์ปดํ“จํ„ฐ๋ฅผ ์ €์žฅํ•  set (์ค‘๋ณต ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋˜๋ฏ€๋กœ)
        result = new HashSet<>();

        // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
        visited = new boolean[N + 1];

        for(int i = 0; i < C; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());

            // ์ปดํ“จํ„ฐ ๋ฒˆํ˜ธ ์ž…๋ ฅ
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            // ํ•ด๋‹น ์ปดํ“จํ„ฐ์— ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ
            worm[a].add(b);
            worm[b].add(a);

        }

        BFS(1);

        // ํ•ด๋‹น ๊ฒฐ๊ณผ ArrayList์— ๋ณธ์ธ ๋ฒˆํ˜ธ๋„ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ 1์„ ๋บŒ
        System.out.println(result.size() - 1);
    }

    public static void BFS(int c){
        Queue<Integer> q = new LinkedList<>();

        // queue์— ์ฐพ์„ ์ปดํ“จํ„ฐ ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์–ด์คŒ
        q.offer(c);
        // ํ•ด๋‹น ๋ฒˆํ˜ธ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited[c] = true;

        // queue๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while(!q.isEmpty()){
            // queue์— ๋“ค์–ด์žˆ๋Š” ๋ฒˆํ˜ธ๋ฅผ ๊บผ๋ƒ„
            int num = q.poll();

            // ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•  ๋ฐฐ์—ด์— ํ•ด๋‹น ๋ฒˆํ˜ธ ์ €์žฅ
            result.add(num);

            // ํ•ด๋‹น ๋ฒˆํ˜ธ ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ ๋ฒˆํ˜ธ๋“ค ์ค‘
            for(int i : worm[num]){
                // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์ด ์žˆ๋‹ค๋ฉด
                if(!visited[i]){
                    // ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ํ›„
                    visited[i] = true;

                    // queue์— ํ•ด๋‹น ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์Œ
                    q.offer(i);
                }
            }
        }
    }
}