1 λΆ„ μ†Œμš”

πŸ“ [D4_3289] μ„œλ‘œμ†Œ 집합

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

public class Solution {
    static StringTokenizer st;
    static int[] arr;
    static int n, m;

    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++) {
            st = new StringTokenizer(br.readLine(), " ");
            sb.append("#").append(T).append(" ");

            // 집합 수
            n = Integer.parseInt(st.nextToken());

            // μ—°μ‚°μ˜ 개수
            m = Integer.parseInt(st.nextToken());

            makeSet();

            for (int i = 0; i < m; i++) {
                st = new StringTokenizer(br.readLine(), " ");
                int cal = Integer.parseInt(st.nextToken());
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());



                // 합집합
                if (cal == 0) {
                    unionSet(a, b);
                }

                // 확인
                else if (cal == 1) {
                    if (findSet(a) == findSet(b)) {
                        sb.append(1);
                    } else {
                        sb.append(0);
                    }
                }
            }
            sb.append("\n");
        }
        System.out.println(sb);
    }

    static void makeSet(){
        arr = new int[n+1];
        for(int i=1; i<=n; i++){
            arr[i] = i;
        }
    }


    // a 집단과 b 집단 ν•©μΉ˜κΈ° -> 0
    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;
    }

    // aκ°€ ν¬ν•¨λœ λŒ€ν‘œμž μ°ΎκΈ° -> 1
    static int findSet(int a) {
        if (a == arr[a]) {
            return a;
        }
        // 경둜 μ••μΆ•
        arr[a] = findSet(arr[a]);
        // ν˜„μž¬μœ„μΉ˜μ˜ λΆ€λͺ¨κ°’ λ°˜ν™˜
        return arr[a];
    }
}

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

μ„œλ‘œμ†Œ 집합 κ΅¬ν•˜κΈ° λ¬Έμ œμ΄λ‹€.
Disjoint - set . makeSet()은 μ΅œμ†Œ λ‹¨μœ„ 집합을 μƒμ„±ν•˜κ³  findSet() 은 집합을 μ°Ύκ³  ( 집합 λŒ€ν‘œμž μ°ΎκΈ° ) union()은 집합을 ν•©μΉ˜λŠ” 것이닀.
각각 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ—¬ 연산을 ν™•μΈν•˜μ—¬ 그에 맞게 1일 λ•Œ 같은 집합에 μžˆλŠ”μ§€ 확인을 ν•΄μ£Όμ–΄μ„œ 좜λ ₯ν•΄μ£Όλ©΄ λœλ‹€.
μ„œλ‘œμ†Œ 집합 μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜λŠ” μ „ν˜•μ μΈ λ¬Έμ œμ΄λ‹€.