๐Ÿ’ก Algorithm

[Java] ์ง‘ํ•ฉ์˜ ํ‘œํ˜„ - ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ (Lv. Gold5)

jcowwk 2025. 2. 14. 10:42

์ง‘ํ•ฉ์˜ ํ‘œํ˜„ - ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ (Lv. Gold5)


1. ๋ฌธ์ œ

2. ํ’€์ด


1. ๋ฌธ์ œ

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

 

2. ํ’€์ด

import java.util.*;
import java.io.*;

class Main {
    static int[] par;
        
    public static int _find(int A) {
        if (par[A] == A) return A;
        return par[A] = _find(par[A]);
    }
    
    public static void _union(int A, int B) {
        int rootA = _find(A);
        int rootB = _find(B);
        
        if (rootA != rootB) {
            par[rootB] = rootA;
        }
    }
    
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        
        par = new int[N + 1];
        
        for (int i = 0; i <= N; i++) {
            par[i] = i;
        }

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int X = Integer.parseInt(st.nextToken());
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());
            
            if (X == 0) {
                _union(A, B);
            } else {
                if (_find(A) == _find(B)) {
                    sb.append("YES\n");
                } else {
                    sb.append("NO\n");
                }
            }
        }
  
        System.out.print(sb);
    }
}

 

- ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ(Union Find) ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ง‘ํ•ฉ์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋‘ ์›์†Œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์žˆ๋Š”์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

1. _union ํ•จ์ˆ˜์—์„œ A์™€ B๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ํ•ฉ์นจ

public static void _union(int A, int B) {
    int rootA = _find(A);
    int rootB = _find(B);

    if (rootA != rootB) {
        par[rootB] = rootA;
    }
}

 

A์™€ B์˜ ๋ถ€๋ชจ๋ฅผ ์ฐพ๊ณ , ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์ง€ ์•Š์œผ๋ฉด B์˜ ๋ถ€๋ชจ๋ฅผ A๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

 

2. _find ํ•จ์ˆ˜์—์„œ A๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์ฐพ๊ธฐ

public static int _find(int A) {
    if (par[A] == A) return A;
    return par[A] = _find(par[A]);
}

 

์ฒ˜์Œ์— par ๋ฐฐ์—ด์„ ๋ชจ๋‘ ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ดˆ๊ธฐํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ A๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด ์ž์‹ ์ด ์ตœ์ƒ์œ„ ๋ฃจํŠธ์ธ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— A๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ณ , A๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์œผ๋ฉด ์ตœ์ƒ์œ„ ๋ฃจํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด find๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋•Œ _find(par[A])๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , par[A] = _find(par[A]); ๋ฅผ ํ•ด์คŒ์œผ๋กœ์จ ๊ฒฝ๋กœ๋ฅผ ์••์ถ•ํ•˜์—ฌ ํŠธ๋ฆฌ ๋†’์ด๊ฐ€ ์ค„์–ด๋“ค์–ด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.


๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š” !

ํ”ผ๋“œ๋ฐฑ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค <3