Notice
Recent Posts
Recent Comments
Today
Total
01-10 18:14
Link
๊ด€๋ฆฌ ๋ฉ”๋‰ด

Partially Committed

[๋ฐฑ์ค€ 1043] ๊ฑฐ์ง“๋ง(JAVA) - Union&Find ๋ณธ๋ฌธ

๐Ÿ”ฅ Algorithm || ๋ฌธ์ œํ’€์ด/PS

[๋ฐฑ์ค€ 1043] ๊ฑฐ์ง“๋ง(JAVA) - Union&Find

WonderJay 2023. 1. 16. 12:42
728x90
๋ฐ˜์‘ํ˜•
SMALL

https://www.acmicpc.net/problem/1043

 

1043๋ฒˆ: ๊ฑฐ์ง“๋ง

์ง€๋ฏผ์ด๋Š” ํŒŒํ‹ฐ์— ๊ฐ€์„œ ์ด์•ผ๊ธฐ ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. ํŒŒํ‹ฐ์— ๊ฐˆ ๋•Œ๋งˆ๋‹ค, ์ง€๋ฏผ์ด๋Š” ์ง€๋ฏผ์ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ•œ๋‹ค. ์ง€๋ฏผ์ด๋Š” ๊ทธ ์ด์•ผ๊ธฐ๋ฅผ ๋งํ•  ๋•Œ, ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ง„์‹ค๋กœ ๋งํ•˜๊ฑฐ๋‚˜ ์—„์ฒญ๋‚˜๊ฒŒ

www.acmicpc.net

๋ฌธ์ œ

์ง€๋ฏผ์ด๋Š” ํŒŒํ‹ฐ์— ๊ฐ€์„œ ์ด์•ผ๊ธฐ ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. ํŒŒํ‹ฐ์— ๊ฐˆ ๋•Œ๋งˆ๋‹ค, ์ง€๋ฏผ์ด๋Š” ์ง€๋ฏผ์ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ•œ๋‹ค. ์ง€๋ฏผ์ด๋Š” ๊ทธ ์ด์•ผ๊ธฐ๋ฅผ ๋งํ•  ๋•Œ, ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ง„์‹ค๋กœ ๋งํ•˜๊ฑฐ๋‚˜ ์—„์ฒญ๋‚˜๊ฒŒ ๊ณผ์žฅํ•ด์„œ ๋งํ•œ๋‹ค. ๋‹น์—ฐํžˆ ๊ณผ์žฅํ•ด์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์žฌ๋ฏธ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋˜๋„๋ก์ด๋ฉด ๊ณผ์žฅํ•ด์„œ ์ด์•ผ๊ธฐํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ง€๋ฏผ์ด๋Š” ๊ฑฐ์ง“๋ง์Ÿ์ด๋กœ ์•Œ๋ ค์ง€๊ธฐ๋Š” ์‹ซ์–ดํ•œ๋‹ค. ๋ฌธ์ œ๋Š” ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ ์ด์•ผ๊ธฐ์˜ ์ง„์‹ค์„ ์•ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ์‚ฌ๋žŒ๋“ค์ด ํŒŒํ‹ฐ์— ์™”์„ ๋•Œ๋Š”, ์ง€๋ฏผ์ด๋Š” ์ง„์‹ค์„ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ๋‹น์—ฐํžˆ, ์–ด๋–ค ์‚ฌ๋žŒ์ด ์–ด๋–ค ํŒŒํ‹ฐ์—์„œ๋Š” ์ง„์‹ค์„ ๋“ฃ๊ณ , ๋˜๋‹ค๋ฅธ ํŒŒํ‹ฐ์—์„œ๋Š” ๊ณผ์žฅ๋œ ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ˆ์„ ๋•Œ๋„ ์ง€๋ฏผ์ด๋Š” ๊ฑฐ์ง“๋ง์Ÿ์ด๋กœ ์•Œ๋ ค์ง€๊ฒŒ ๋œ๋‹ค. ์ง€๋ฏผ์ด๋Š” ์ด๋Ÿฐ ์ผ์„ ๋ชจ๋‘ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

์‚ฌ๋žŒ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด์•ผ๊ธฐ์˜ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํŒŒํ‹ฐ์— ์˜ค๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ง€๋ฏผ์ด๋Š” ๋ชจ๋“  ํŒŒํ‹ฐ์— ์ฐธ๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ, ์ง€๋ฏผ์ด๊ฐ€ ๊ฑฐ์ง“๋ง์Ÿ์ด๋กœ ์•Œ๋ ค์ง€์ง€ ์•Š์œผ๋ฉด์„œ, ๊ณผ์žฅ๋œ ์ด์•ผ๊ธฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒํ‹ฐ ๊ฐœ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์‚ฌ๋žŒ์˜ ์ˆ˜ N๊ณผ ํŒŒํ‹ฐ์˜ ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ์ด์•ผ๊ธฐ์˜ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜์™€ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๊ฐ€ ๋จผ์ € ์ฃผ์–ด์ง€๊ณ  ๊ทธ ๊ฐœ์ˆ˜๋งŒํผ ์‚ฌ๋žŒ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์‚ฌ๋žŒ๋“ค์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค.

์…‹์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ํŒŒํ‹ฐ๋งˆ๋‹ค ์˜ค๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜์™€ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

N, M์€ 50 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๊ณ , ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋Š” 0 ์ด์ƒ 50 ์ดํ•˜์˜ ์ •์ˆ˜, ๊ฐ ํŒŒํ‹ฐ๋งˆ๋‹ค ์˜ค๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋Š” 1 ์ด์ƒ 50 ์ดํ•˜์˜ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฐ๊ฐ์˜ ํŒŒํ‹ฐ์— ์ฐธ์—ฌํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ฌถ์–ด์ค€๋‹ค(Union).

 

๊ทธ๋Ÿฌ๋ฉด k ๋ฒˆ์งธ ํŒŒํ‹ฐ์— ์†ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋ชจ๋‘ ๊ฐ™์€ ์ง‘ํ•ฉ์— ํ•ด๋‹นํ•œ๋‹ค.

 

k ๋ฒˆ์งธ ํŒŒํ‹ฐ์— ์†ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ง‘ํ•ฉ์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ,

 

๊ตณ์ด k ๋ฒˆ์งธ ํŒŒํ‹ฐ์˜ ์ธ์› ์ „์ฒด๋ฅผ ์ˆœํšŒํ•  ํ•„์š”๋Š” ์—†๊ณ ,

 

์ž…๋ ฅ์„ ๋ฐ›์œผ๋ฉด์„œ ๊ฐ๊ฐ์˜ ํŒŒํ‹ฐ์— ์†ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋ชจ๋‘ union ํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—

 

k ๋ฒˆ์งธ ํŒŒํ‹ฐ์˜ ์ฒซ ๋ฒˆ์งธ ์‚ฌ๋žŒ์ด N ๋ฒˆ์งธ ์ง‘ํ•ฉ์— ์†ํ•˜๋ฉด k ๋ฒˆ์งธ ํŒŒํ‹ฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์ด N ๋ฒˆ์งธ ์ง‘ํ•ฉ์— ์†ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ๊ฐ์˜ ํŒŒํ‹ฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ,

 

๊ฐ๊ฐ์˜ ํŒŒํ‹ฐ์˜ ์ฒซ๋ฒˆ ์งธ ์‚ฌ๋žŒ๊ณผ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•œ๋‹ค๋ฉด

 

ํ•ด๋‹น ํŒŒํ‹ฐ์—์„œ ๊ฑฐ์ง“๋ง์„ ํ•˜๋ฉด ๋“คํ‚ค๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๊ณผ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•˜์ง€ ์•Š๋Š” ํŒŒํ‹ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 


์†Œ์Šค์ฝ”๋“œ(JAVA)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
    public static ArrayList<Integer>[] party;
    public static int[] parent;

    public static void main(String[] args) throws IOException {
        int n, m;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk = new StringTokenizer(br.readLine());
        n = Integer.parseInt(stk.nextToken()); // ์‚ฌ๋žŒ์˜ ์ˆ˜
        m = Integer.parseInt(stk.nextToken()); // ํŒŒํ‹ฐ์˜ ์ˆ˜
        int k; // ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜
        stk = new StringTokenizer(br.readLine());
        k = Integer.parseInt(stk.nextToken());
        int[] true_man = new int[k];
        for (int i = 0; i < k; i++) {
            true_man[i] = Integer.parseInt(stk.nextToken());
        } // ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅ

        parent = new int[n + 1];
        party = new ArrayList[m];
        for (int i = 0; i < m; i++) { // ํŒŒํ‹ฐ์˜ ์ˆ˜ ๋งŒํผ
            party[i] = new ArrayList<>();
            stk = new StringTokenizer(br.readLine());
            int party_size = Integer.parseInt(stk.nextToken());
            for (int j = 0; j < party_size; j++) {
                party[i].add(Integer.parseInt(stk.nextToken()));
            }
        }

        for (int i = 0; i <= n; i++) {
            parent[i] = i;
        }
        for (int i = 0; i < m; i++) {
            int first_man = party[i].get(0);
            for (int j = 1; j < party[i].size(); j++) {
                union(first_man, party[i].get(j));
            } // ๊ฐ๊ฐ์˜ ํŒŒํ‹ฐ์— ์ฐธ์„ํ•œ ์ธ์›๋“ค์€ ๊ฐ™์€ ์ง‘ํ•ฉ์œผ๋กœ ๋ถ„๋ฅ˜ํ•จ
        }
        // parent ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์œผ๋กœ ๋ถ„๋ฅ˜๋˜์–ด ์žˆ๋‹ค๋ฉด
        // ํ•ด๋‹น ์‚ฌ๋žŒ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ๋”ํ•ด์„œ ์ถœ๋ ฅํ•˜๋ฉด ๋จ
        int cnt = 0;
        for (int i = 0; i < m; i++) {
            int leader = party[i].get(0);
            boolean flag = true;
            for (int j = 0; j < k; j++) {
                if (isitsame(leader, true_man[j])) {
                    // ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๊ณผ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•œ๋‹ค๋ฉด
                    flag = false;
                    break;
                }
            }
            if (flag) {
                // ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๊ณผ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด
                // ํ•ด๋‹น ํŒŒํ‹ฐ์—์„œ๋Š” ๊ฑฐ์ง“๋ง์„ ํ•ด๋„ ๋“คํ‚ค์ง€ ์•Š์Œ
                cnt++;
            }
        }
        System.out.println(cnt);
    }

    public static void union(int a, int b) {
        a = find(a);
        b = find(b);
        if (a != b) {
            // a ์™€ b ๊ฐ€ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์— ์†ํ•œ๋‹ค๋ฉด
            parent[b] = a; // ๊ฐ™์€ ์ง‘ํ•ฉ์œผ๋กœ ๋ฌถ์–ด์ฃผ๊ธฐ
        }
    }

    public static int find(int a) {
        if (parent[a] == a) {
            // a ์˜ ๋ถ€๋ชจ๊ฐ€ a ์ด๋ฉด(root)
            return a;
        } else {
            return parent[a] = find(parent[a]);
        }
    }

    public static boolean isitsame(int a, int b) {
        if (find(a) == find(b)) { // ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•œ๋‹ค๋ฉด true
            return true;
        } else return false;
    }
}
728x90
๋ฐ˜์‘ํ˜•
LIST
Comments