Algorithm & Data Structures/BOJ

b20040. ์‚ฌ์ดํด๊ฒŒ์ž„

Geisha 2025. 5. 12. 21:22

 

 

 

๐Ÿ” ์ž๋ฐ”๋กœ ํ‘ธ๋Š” ์‚ฌ์ดํด ๊ฒŒ์ž„ ๋ฌธ์ œ ํ’€์ด

 


 

๐Ÿ“Œ ๋ฌธ์ œ ๊ฐœ์š”

 

๋ฐฑ์ค€ 20040 - ์‚ฌ์ดํด ๊ฒŒ์ž„ ๋ฌธ์ œ๋Š”

N๊ฐœ์˜ ์ •์ ์ด ์žˆ๊ณ , M๊ฐœ์˜ ๊ฐ„์„ ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•  ๋•Œ

์‚ฌ์ดํด์ด ์ฒ˜์Œ ์ƒ๊ธฐ๋Š” ์‹œ์ ์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

  • ๊ฐ„์„ ์€ ์ฐจ๋ก€๋กœ ์—ฐ๊ฒฐ๋˜๋ฉฐ,
  • ๊ฐ„์„ ์„ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์ดํด์ด ์ƒ๊ธฐ๋ฉด ๊ทธ **์ฐจ๋ก€(1-indexed)**๋ฅผ ์ถœ๋ ฅ
  • ๋๊นŒ์ง€ ์‚ฌ์ดํด์ด ์—†์œผ๋ฉด 0์„ ์ถœ๋ ฅ

 


 

๐Ÿ’ก ์˜ˆ์ œ ์ž…๋ ฅ

6 5
0 1
1 2
2 3
0 3
4 5

 

์˜ˆ์ œ ์ถœ๋ ฅ

4

 


 

๐Ÿง  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ‘๊ทผ ๋ฐฉ์‹

 

์ด ๋ฌธ์ œ๋Š” ์ „ํ˜•์ ์ธ Union-Find(์„œ๋กœ์†Œ ์ง‘ํ•ฉ) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•ด

์‚ฌ์ดํด์„ ํƒ์ง€ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

  • ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ๋‘ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ๊ฐ™์€ ์ง‘ํ•ฉ์ด๋ฉด ์‚ฌ์ดํด ๋ฐœ์ƒ
  • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉ์นจ (union)
  • ์‚ฌ์ดํด์ด ์ƒ๊ธด ์ฒซ ๋ฒˆ์งธ ๊ฐ„์„ ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅ

 


 

๐Ÿงพ ์ฝ”๋“œ ํ•ด์„ค

// ๋ถ€๋ชจ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
p = new int[N + 1];
for (int i = 1; i <= N; i++) {
    p[i] = i;
}
// ๊ฐ„์„ ๋งˆ๋‹ค ์‚ฌ์ดํด ์—ฌ๋ถ€ ์ฒดํฌ
for (int i = 0; i < M; i++) {
    int a = Integer.parseInt(st.nextToken());
    int b = Integer.parseInt(st.nextToken());

    if (find(a) == find(b)) {
        sb.append(i + 1);
        check = false;
        break;
    } else {
        union(a, b);
    }
}
private static int find(int a) {
    if (a == p[a]) return p[a];
    return p[a] = find(p[a]); // ๊ฒฝ๋กœ ์••์ถ•
}
private static void union(int a, int b) {
    int pa = find(a);
    int pb = find(b);

    if (pb < pa) {
        int temp = pa;
        pa = pb;
        pb = temp;
    }
    p[pb] = pa;
}

 

  • find(): ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ๊ฒฝ๋กœ ์••์ถ•
  • union(): ์ž‘์€ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€๋ชจ๋กœ ์‚ผ์•„ ๋ณ‘ํ•ฉ (์ •๋ ฌ์€ ์„ ํƒ)
  • ์‚ฌ์ดํด ํŒ๋ณ„: find(a) == find(b)์ผ ๋•Œ ์‚ฌ์ดํด ๋ฐœ์ƒ

 


 

โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ

 

  • Union-Find๋กœ ์—ฐ๊ฒฐ ์—ฌ๋ถ€๋ฅผ ์ถ”์ 
  • ์‚ฌ์ดํด์€ ๋‘ ์ •์ ์ด ์ด๋ฏธ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์žˆ์„ ๋•Œ ์ƒ๊ธด๋‹ค
  • ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ์‚ฌ์ดํด์ด ์ฒ˜์Œ ์ƒ๊ธฐ๋Š” ์‹œ์ ์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค

 


 

๐ŸŽฏ ๊ฒฐ๋ก : Union-Find๋กœ ์‚ฌ์ดํด์„ ์žก์•„๋‚ด๋‹ค

 

์ด ๋ฌธ์ œ๋Š” DFS, BFS ์—†์ด ์ง‘ํ•ฉ๋งŒ ๊ด€๋ฆฌํ•ด๋„ ์‚ฌ์ดํด์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ

๊ทธ๋ž˜ํ”„์˜ ํ•ต์‹ฌ์ ์ธ ์‚ฌ๊ณ ์ธ “์—ฐ๊ฒฐ๊ณผ ์ง‘ํ•ฉ”์„ ์—ฐ์Šตํ•˜๊ธฐ์— ์ข‹์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

์—ฐ๊ฒฐ → ๊ฐ™์€ ์ง‘ํ•ฉ
์‚ฌ์ดํด → ์ด๋ฏธ ์—ฐ๊ฒฐ๋œ ์ง‘ํ•ฉ์— ๋˜ ์—ฐ๊ฒฐํ•˜๋ ค ํ•  ๋•Œ