1 λΆ„ μ†Œμš”

πŸ“ [D4_7465] 창용 λ§ˆμ„ 무리의 개수

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


public class Solution {
    static StringTokenizer st;
    static int[] arr;
    static int N;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 번호
        int tc = Integer.parseInt(br.readLine());

        for(int T=1; T<=tc; T++){
            sb.append("#").append(T).append(" ");
            st = new StringTokenizer(br.readLine(), " ");


            // μ‚¬λžŒμ˜ 수
            N = Integer.parseInt(st.nextToken());
            // 관계 수
            int M = Integer.parseInt(st.nextToken());

            makeSet();
            for(int i = 0; i<M; i++){
                st = new StringTokenizer(br.readLine(), " ");
                int start = Integer.parseInt(st.nextToken());
                int end = Integer.parseInt(st.nextToken());

                // 집합 ν•©μΉ˜κΈ°
                unionSet(start, end);
            }

            // 집합 개수 κ΅¬ν•˜κΈ°
            ArrayList<Integer> list = new ArrayList<Integer>();
            for(int i=1; i<=N; i++){
                int temp = findSet(i);
                if(list.contains(temp)){
                    continue;
                }
                list.add(temp);
            }
            sb.append(list.size()).append("\n");

        }
        System.out.println(sb);
    }


    // μ‚¬λžŒλ“€ κ·Έλ£Ή μ •μ˜
    static void makeSet(){
        arr = new int[N+1];
        for(int i=1; i<=N; i++){
            arr[i] = i;
        }
    }

    static boolean unionSet(int a, int b){
        int aRoot = findSet(a);
        int bRoot = findSet(b);

        if(aRoot == bRoot){
            return false;
        }

        arr[bRoot] = aRoot;
        return true;
    }

    static int findSet(int a){
        if(a == arr[a]){
            return a;
        }
        arr[a] = findSet(arr[a]);
        return arr[a];
    }
}

πŸ€” λ‚˜μ˜ 생각

μ„œλ‘œμ†Œ 집합과 같은 λ¬Έμ œμ΄λ‹€.
단지 μ„œλ‘œμ†Œ μ§‘ν•©μ—μ„œ λΆ€λͺ¨λ…Έλ“œλ“€μ˜ 개수λ₯Ό ꡬ해주면 λœλ‹€. 그것이 μ§‘ν•©μ˜ 수이기 λ•Œλ¬Έμ΄λ‹€.
집합을 ν•©μΉ˜κ±°λ‚˜ 무리λ₯Ό κ΅¬ν•˜λŠ” 문제 같은 것은 μ„œλ‘œμ†Œ 집합을 κ΅¬ν•˜λŠ” 방법과 같이 ν•˜λ©΄ μ‰½κ²Œ ν’€λ¦°λ‹€.