๊ธฐ๋ก๋ฐฉ

BOJ_11724 : ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_11724 : ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜

Soom_1n 2023. 1. 23. 16:36

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

 

11724๋ฒˆ: ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฐ„์„ ์˜ ์–‘ ๋์  u์™€ v๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ u, v ≤ N, u ≠ v) ๊ฐ™์€ ๊ฐ„์„ ์€ ํ•œ ๋ฒˆ๋งŒ ์ฃผ

www.acmicpc.net



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

  • n๊ฐœ์˜ ์ •์  ์‚ฌ์ด์˜ ๊ฐ„์„ ์˜ ์ •๋ณด๊ฐ€ m๊ฐœ ์ž…๋ ฅ๋œ๋‹ค.
    • ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ๋ฌถ์Œ(์—ฐ๊ฒฐ ์š”์†Œ) ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • n๊ฐœ์˜ ๊ฐ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ BFS ํ˜น์€ DFS๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ์ฒดํฌํ•œ๋‹ค.
    • ์—ฌ๊ธฐ์„œ๋Š” BFS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • BFS๋ฅผ ์œ„ํ•ด ํ์™€ visit ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • visit ๋ฐฐ์—ด์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์œผ๋ฉด 0, ๋ฐฉ๋ฌธํ•˜๋ฉด ๋ฌถ์Œ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•œ๋‹ค. (0๋งŒ ์•„๋‹ˆ๋ฉด ๋œ๋‹ค.)
  • ๋ฌถ์Œ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

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

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 1 : input
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        ArrayList<Integer>[] graph = new ArrayList[n + 1];
        for (int i = 1; i <= n; i++) {
            graph[i] = new ArrayList<>();
        }
        for (int i = 0; i < m; i++) {
            int u = sc.nextInt();
            int v = sc.nextInt();
            if (!graph[u].contains(v))
                graph[u].add(v);
            if (!graph[v].contains(u))
                graph[v].add(u);
        }

        // 2 : BFS
        Queue<Integer> queue = new LinkedList<>();
        int[] visit = new int[n + 1];
        int gruop = 0;
        for (int i = 1; i <= n; i++) {
            if (visit[i] == 0) {
                gruop++;
                queue.add(i);
                while (!queue.isEmpty()) {
                    int now = queue.poll();
                    if (visit[now] == 0) {
                        visit[now] = gruop;
                        for (int g : graph[now]) {
                            queue.add(g);
                        }
                    }
                }
            }
        }
        System.out.println(gruop);
    }
}

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

  • 1) ๋…ธ๋“œ ์ˆ˜ n๊ณผ ๊ฐ„์„  ์ˆ˜ m์„ ์ž…๋ ฅ๋ฐ›๊ณ , n ํฌ๊ธฐ์˜ ArrayList ๋ฐฐ์—ด graph๋ฅผ ์„ ์–ธํ•œ๋‹ค.
    • m๊ฐœ์˜ ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„ graph์— ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • 2) BFS๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ํ, visit ๋ฐฐ์—ด, ๊ทธ๋ฃน ์ˆ˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.
    • 1๋ถ€ํ„ฐ n๋ฒˆ ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ๊ฐ ์‹œ์ž‘๋…ธ๋“œ๋กœ ์„ค์ •ํ•ด๋ณธ๋‹ค.
    • ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉด BFS๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. 
      • ๊ทธ๋ฃน ๋ฒˆํ˜ธ๋ฅผ +1 ํ•œ๋‹ค. 
      • ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ๋‹ด๋Š”๋‹ค.
      • ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰ํ•œ๋‹ค.
        • ํ์—์—์„œ ๊ฐ’์„ ํ•˜๋‚˜ poll ํ•œ ๋’ค now์— ์ €์žฅํ•œ๋‹ค. 
        • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ visit[now] ๊ฐ’์ด 0์ด๋ฉด, ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ณ„์‚ฐ์„ ์ง„ํ–‰ํ•œ๋‹ค.
          • visit[now]์— ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค(0๋งŒ ์•„๋‹ˆ๋ฉด ๋˜์ง€๋งŒ, ์ด์˜๊ฒŒ ๊ทธ๋ฃน ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.)
          • now๋ฒˆ์งธ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ์–ด์ค€๋‹ค.
            • ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด๋„ ๋˜์ง€๋งŒ, ์–ด์ฐจํ”ผ visit[now]๊ฐ€ 0์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋”ฐ๋กœ ์ถ”๊ฐ€ํ•˜์ง„ ์•Š์•˜๋‹ค.

 


๐Ÿ”ธ end ๐Ÿ”ธ

  • ์˜ค๋žœ๋งŒ์— BFS๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์•˜๋Š”๋ฐ, ์•„์ง ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋“ค์˜ ์ˆ™๋ จ๋„๊ฐ€ ๋‚ฎ์€ ๊ฒƒ ๊ฐ™๋‹ค.
    • ๊ทธ๋ž˜ํ”„์™€ dp๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ํ’€์–ด๋ณด์•„์•ผ๊ฒ ๋‹ค.
  • ๊ฐ ๋…ธ๋“œ๊ฐ€ ์–ด๋–ค ๊ทธ๋ฃน์ธ์ง€ ๋‚˜ํƒ€๋‚ด๊ณ ์ž visit์„ int[]๋กœ ์„ ์–ธํ–ˆ์ง€๋งŒ, boolean[]์ด ๋” ๋งž๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
  • ๋ฌธ์ œ ๋ถ„์„ ๋ฐ ์ฝ”๋“œ ๊ณ„ํš์„ ์จ๋ณด๊ณ  ์ฝ”๋”ฉ์— ๋“ค์–ด๊ฐ”๋‹ค.

728x90