๊ธฐ๋ก๋ฐฉ

BOJ_1043 : ๊ฑฐ์ง“๋ง ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1043 : ๊ฑฐ์ง“๋ง

Soom_1n 2023. 6. 9. 20:39

 

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

 

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

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

www.acmicpc.net



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

  • ๋ฌธ์ œ ๋‚ด์šฉ
    • N๋ช…์˜ ์‚ฌ๋žŒ๊ณผ M๊ฐœ์˜ ํŒŒํ‹ฐ๊ฐ€ ์žˆ๋‹ค.
    • ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์ฐธ์—ฌํ•œ ํŒŒํ‹ฐ์—์„œ๋Š” ์ง„์‹ค๋งŒ ๋งํ•ด์•ผ ํ•œ๋‹ค.
    • ์ง„์‹ค์„ ๋งํ•œ ํŒŒํ‹ฐ์— ์žˆ๋˜ ์‚ฌ๋žŒ๋“ค๋„ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ๋œ๋‹ค.
    • ๊ฑฐ์ง“์„ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒํ‹ฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ํ’€์ด ์ „๋žต
    • ๊ฐ™์€ ํŒŒํ‹ฐ ์ฐธ๊ฐ€์ž๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.
    • ๊ฐ ํŒŒํ‹ฐ๋ณ„ ์ฐธ๊ฐ€์ž List์™€ ๊ฐœ์ธ ๋ณ„ ์ฐธ๊ฐ€ ํŒŒํ‹ฐ List๋ฅผ ๋งŒ๋“ ๋‹ค.
    • BFS๋กœ ์ง„์‹ค์„ ๋งํ•œ ํŒŒํ‹ฐ์™€ ์ง„์‹ค์„ ์•Œ๊ฒŒ๋œ ์‚ฌ๋žŒ๋“ค์„ ์ถ”๊ฐ€ํ•ด ๋‚˜๊ฐ„๋‹ค.
    • ์ง„์‹ค์„ ๋งํ•˜์ง€ ์•Š์€ ํŒŒํ‹ฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • 2024.04.22 ์ถ”๊ฐ€
    • ๊ธฐ์กด์— BFS๋ฅผ ํ†ตํ•ด ํ’€์ดํ–ˆ์ง€๋งŒ, ๋ถ„๋ฆฌ ์ง‘ํ•ฉ์œผ๋กœ๋„ ํ’€์ดํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋‹ค์‹œ ํ’€์–ด๋ณด์•˜๋‹ค.
    • ๊ฐ™์€ ํŒŒํ‹ฐ์— ์ฐธ๊ฐ€ํ•œ ์ธ์›๋“ค์„ union ์—ฐ์‚ฐ์œผ๋กœ ๊ฐ™์€ ์ง‘ํ•ฉ์— ๋„ฃ์–ด์ค€๋‹ค.
    • ํŒŒํ‹ฐ์˜ ์ง‘ํ•ฉ์— ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์นด์šดํŠธํ•œ๋‹ค.

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

import java.io.*;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

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

        ArrayList<Integer>[] person = new ArrayList[N + 1];
        ArrayList<Integer>[] party = new ArrayList[M];
        Boolean[] know = new Boolean[N + 1];
        Boolean[] visited = new Boolean[M];

        for (int i = 1; i <= N; i++) {
            person[i] = new ArrayList<>();
            know[i] = false;
        }

        for (int i = 0; i < M; i++) {
            party[i] = new ArrayList<>();
            visited[i] = false;
        }

        for (int i = 0; i < M; i++) {
            StringTokenizer st1 = new StringTokenizer(br.readLine());
            int person_cnt = Integer.parseInt(st1.nextToken());
            for (int j = 0; j < person_cnt; j++) {
                int ps = Integer.parseInt(st1.nextToken());
                party[i].add(ps); // ํŒŒํ‹ฐ ๋ณ„ ์ฐธ๊ฐ€์ž ๊ธฐ๋ก
                person[ps].add(i); // ๊ฐœ์ธ ๋ณ„ ์ฐธ๊ฐ€ ํŒŒํ‹ฐ ๊ธฐ๋ก
            }
        }

        // BFS
        int cnt = M;
        Queue<Integer> que = new ArrayDeque<>();

        // ์ฒ˜์Œ ๋ถ€ํ„ฐ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค ํ ์ดˆ๊ธฐํ™”
        int know_cnt = Integer.parseInt(st.nextToken());
        for (int i = 0; i < know_cnt; i++) {
            int k = Integer.parseInt(st.nextToken());
            know[k] = true;
            que.add(k);
        }

        while (!que.isEmpty()) {
            int np = que.poll();
            for (int pt : person[np]) {
                if (!visited[pt]) {
                    visited[pt] = true;
                    cnt--;
                    for (int ps : party[pt]) {
                        if (!know[ps]) {
                            know[ps] = true;
                            que.add(ps);
                        }
                    }
                }
            }
        }

        // Output
        bw.write(Integer.toString(cnt));
        bw.flush();
    }
}

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

  • ๊ฐœ์ธ ๋ณ„ ์ฐธ๊ฐ€ํ•œ ํŒŒํ‹ฐ ๋ฒˆํ˜ธ, ํŒŒํ‹ฐ ๋ณ„ ์ฐธ๊ฐ€์ž ๋ฒˆํ˜ธ๋ฅผ ArrayList์— ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
  • ์ฒ˜์Œ๋ถ€ํ„ฐ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค์€ ํ์˜ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๋„ฃ๋Š”๋‹ค.
    • ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ ๋ช…๋‹จ know ๋ฐฐ์—ด์„ true๋กœ ๋ฐ”๊พผ๋‹ค.
  • ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ํ˜„์žฌ ์ฐธ๊ฐ€์ž๊ฐ€ ์ฐธ์—ฌํ•œ ํŒŒํ‹ฐ ๋ชฉ๋ก์„ ์ˆœํšŒํ•œ๋‹ค.
    • ์•„์ง ๊ฑฐ์ง“ ํŒŒํ‹ฐ์˜€์œผ๋ฉด, ์ง„์‹ค์„ ๋“ค์—ˆ์œผ๋ฏ€๋กœ visited๋ฅผ true๋กœ ๋ฐ”๊พธ๊ณ ,
      ๊ฑฐ์ง“ ํŒŒํ‹ฐ์˜ ์ˆ˜ cnt๋ฅผ -1ํ•œ๋‹ค.
    • ํ•ด๋‹น ํŒŒํ‹ฐ์— ์†Œ์† ๋œ ์ฐธ๊ฐ€์ž๋“ค ์ค‘ ์ง„์‹ค์„ ์•Œ๊ฒŒ๋œ ์‚ฌ๋žŒ๋“ค์„ ํ์— ๋„ฃ๊ณ  know๋Š” true๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
  • cnt๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ”ธ ๋ถ„๋ฆฌ ์ง‘ํ•ฉ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
    private static int[] parent;

    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        int known = Integer.parseInt(st.nextToken());

        if (known == 0) {
            bw.write(Integer.toString(M));
            bw.flush();
            return;
        }

        parent = new int[N + 1];
        for (int i = 1; i <= N; i++) {
            parent[i] = i;
        }

        // Disjoint Set

        int[] knowns = new int[known]; // ์‚ฌ์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค
        ArrayList<Integer>[] list = new ArrayList[M];

        for (int i = 0; i < known; i++) {
            knowns[i] = Integer.parseInt(st.nextToken());
        }

        for (int i = 0; i < M; i++) {
            list[i] = new ArrayList<>();
            st = new StringTokenizer(br.readLine());

            int people = Integer.parseInt(st.nextToken());

            int first = Integer.parseInt(st.nextToken());
            list[i].add(first);
            first = find(first);

            for (int j = 1; j < people; j++) {
                int member = Integer.parseInt(st.nextToken());
                list[i].add(member);
                union(first, member);
            }
        }

        int cnt = 0;
        for (int i = 0; i < M; i++) {
            boolean flag = true;
            int pp = find(list[i].get(0));
            for (int j = 0; j < known; j++) {
                if (find(pp) == find(knowns[j])) {
                    flag = false;
                    break;
                }
            }
            if (flag) cnt++;
        }

        // Output
        bw.write(Integer.toString(cnt));
        bw.flush();
    }

    private static void union(int a, int b) {
        int ap = find(a);
        int bp = find(b);

        if (ap != bp) parent[ap] = bp;
    }

    private static int find(int a) {
        if (parent[a] == a) return a;
        return parent[a] = find(parent[a]);
    }
}

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์†Œ์†(์—ฐ๊ฒฐ) ์ •๋ณด๋ฅผ ArrayList๋กœ ์ €์žฅํ•œ ๋’ค BFS๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ํ’€์ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ๋ฌธ์ œ ํƒœ๊ทธ์— ๋ถ„๋ฆฌ ์ง‘ํ•ฉ(Disjoint Set) ์ด ์žˆ๊ธธ๋ž˜ ํ•ด๋‹น ํ’€์ด๋ฅผ ์ฐพ์•„๋ณด์•˜๋‹ค. (์ฐธ๊ณ  ํฌ์ŠคํŒ…)
    • ์—ฐ๊ฒฐ ๋˜์–ด ์žˆ๋Š” ์ฐธ๊ฐ€์ž๋“ค์„ ๊ฐ™์€ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด์žˆ๋‹ค๊ณ  ๋ณด๊ณ , ์ง‘ํ•ฉ์˜ ํ•œ ์›์†Œ๊ฐ€ ์ง„์‹ค์„ ์•Œ๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์ง‘ํ•ฉ ๋ชจ๋‘ ์ง„์Šฌ์„ ์•„๋Š” ๋ฐฉ์‹์˜ ํ’€์ด์—ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์ธ Union-Find์™€ ๋‹ค๋ฅด๊ฒŒ, ์ง‘ํ•ฉ ๋‚ด ์›์†Œ ๋ชจ๋‘ ์ง„์‹ค์„ ์•Œ๊ฒŒ ๋˜๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ–ˆ๊ณ , ๊ฑฐ์ง“ ํŒŒํ‹ฐ์˜ ์นด์šดํŠธ๊ฐ€ ํ•„์š”ํ•ด์„œ ์ถ”๊ฐ€์ ์ธ ์•„์ด๋””์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
  • ๋ฌธ์ œ ๋ถ„์„๊ณผ ํ’€์ด ๊ณ„ํš์„ ์ ์–ด๊ฐ€๋ฉฐ ํ’€์ดํ–ˆ๋‹ค.

728x90

'CodingTest > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ_1167 : ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„  (0) 2023.06.25
BOJ_15663 : N๊ณผ M (9)  (0) 2023.06.11
BOJ_1149 : RGB๊ฑฐ๋ฆฌ  (0) 2023.06.08
Lv.1 : ๊ณต์› ์‚ฐ์ฑ…  (0) 2023.04.26
Lv.1 : ์ถ”์–ต ์ ์ˆ˜  (0) 2023.04.25