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

[Java] BOJ 11724 ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜

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

๋ฌธ์ œ 

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

  • ๋ฐฉํ–ฅ ์—†๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์—ฐ๊ฒฐ ์š”์†Œ (Connected Component)์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
  • ์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2)
  • ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฐ„์„ ์˜ ์–‘ ๋์  u์™€ v๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ u, v ≤ N, u ≠ v) ๊ฐ™์€ ๊ฐ„์„ ์€ ํ•œ ๋ฒˆ๋งŒ ์ฃผ์–ด์ง„๋‹ค.
  • ์ฒซ์งธ ์ค„์— ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

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

  • ๋…ธ๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์„๋•Œ๋งˆ๋‹ค ArrayList๋กœ ์„œ๋กœ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.
  • for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ๋…ธ๋“œ๋ฅผ ๋Œ๋ฉด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋กœ BFS๋ฅผ ๋Œ๋ฆฐ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  BFS๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž…๋ ฅ๋“ค์–ด์˜จ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  • ๊ทธ๋ž˜์„œ BFS๋ฅผ ๋Œ๋ฆด๋•Œ๋งˆ๋‹ค ์นด์šดํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ๋” ํ•ด์ค€๋‹ค.

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

  • X

BFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์— ์ข€ ์ต์ˆ™ํ•ด์ง„ ๊ฒƒ ๊ฐ™์•„์„œ ์ข‹์•˜๋‹ค!!

์ฝ”๋“œ

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

public class BOJ11724 {

    static int N;
    static int M;
    static boolean visited[];
    static ArrayList<Integer> graph[];

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

        StringTokenizer st = new StringTokenizer(br.readLine());

        // ์ •์ ์˜ ๊ฐœ์ˆ˜
        N = Integer.parseInt(st.nextToken());
        // ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
        M = Integer.parseInt(st.nextToken());

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

        // ์—ฐ๊ฒฐ๋œ ์ •์ ์„ ์ €์žฅํ•  ArrayList
        graph = new ArrayList[N + 1];

        for(int i = 0; i <= N; i++){
            graph[i] = new ArrayList<>();
        }

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

            // ๊ธฐ์ค€ ๋…ธ๋“œ
            int a = Integer.parseInt(st2.nextToken());
            // ์—ฐ๊ฒฐ ๋…ธ๋“œ
            int b = Integer.parseInt(st2.nextToken());

            // ์„œ๋กœ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ
            graph[a].add(b);
            graph[b].add(a);
        }

        // ์—ฐ๊ฒฐ ๊ฐœ์ˆ˜๋ฅผ ์…€ ๋ณ€์ˆ˜
        int cnt = 0;

        // ๋…ธ๋“œ ๋ฒˆํ˜ธ๋Œ€๋กœ ๋Œ๋‹ค๊ฐ€
        for(int i = 1; i <= N; i++){
            // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด
            if(!visited[i]){
                // BFS๋ฅผ ๋Œ๋ฆฌ๊ณ 
                BFS(i);

                // ์—ฐ๊ฒฐ ๊ฐœ์ˆ˜ + 1
                cnt = cnt + 1;
            }
        }

        System.out.println(cnt);
    }

    public static void BFS(int n){
        // ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•  Queue
        LinkedList<Integer> q = new LinkedList<>();

        // Queue์— ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์„ ๋„ฃ์Œ
        q.offer(n);

        // ํ•ด๋‹น ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited[n] = true;

        while(!q.isEmpty()){
            // ๋งจ ์œ„์˜ ๋ ๊ฐ’์„ ๋”ฐ๋กœ ์ €์žฅ
            int node = q.peek();

            q.poll();

            // ๋…ธ๋“œ๋ž‘ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต
            for(int i : graph[node]){
                // ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
                if(!visited[i]){
                    // Queue์— ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ 
                    q.add(i);

                    // ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
                    visited[i] = true;
                }
            }
        }
    }
}