b1717. μ§‘ν•©μ˜ ν‘œν˜„

2025. 5. 6. 19:42Β·Algorithm & Data Structures/BOJ

 

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

 

 

 

🧩 μžλ°”λ‘œ ν‘ΈλŠ” μ§‘ν•©μ˜ ν‘œν˜„ 문제 풀이

 


 

πŸ“Œ 문제 κ°œμš”

 

λ°±μ€€ 1717번 μ§‘ν•©μ˜ ν‘œν˜„ λ¬Έμ œλŠ” Disjoint Set(μ„œλ‘œμ†Œ μ§‘ν•©) 자료ꡬ쑰의 κΈ°λ³Έ λ™μž‘μΈ Find와 Union을 κ΅¬ν˜„ν•˜λŠ” λŒ€ν‘œμ μΈ λ¬Έμ œμž…λ‹ˆλ‹€.

 

  • μ—°μ‚° μ’…λ₯˜
    • 0 a b : a와 bκ°€ μ†ν•œ 집합을 ν•©μΉœλ‹€.
    • 1 a b : a와 bκ°€ 같은 집합에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
  •  

 


 

πŸ’‘ 예제 μž…λ ₯

7 8
0 1 3
1 1 7
0 7 6
1 7 1
0 3 7
0 4 2
0 1 1
1 1 1

예제 좜λ ₯:

NO
NO
YES

 

 


 

🧠 μ•Œκ³ λ¦¬μ¦˜ μ ‘κ·Ό 방식

 

  • 핡심은 Union-Find μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.
  • 각 μ›μ†ŒλŠ” μžμ‹ μ΄ μ†ν•œ μ§‘ν•©μ˜ λŒ€ν‘œ(parent)λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • find(x)λ₯Ό 톡해 λŒ€ν‘œλ₯Ό μ°Ύκ³ , union(x, y)λ₯Ό 톡해 두 집합을 λ³‘ν•©ν•©λ‹ˆλ‹€.
  • findμ—λŠ” **경둜 μ••μΆ•(Path Compression)**을 μ μš©ν•΄ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό μ€„μž…λ‹ˆλ‹€.

 


 

🧾 μ½”λ“œ ν•΄μ„€

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

public class Main {
    static int n, m;
    static int[] parent;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        parent = new int[n + 1];

        for (int i = 0; i <= n; i++) parent[i] = i;

        StringBuilder sb = new StringBuilder();

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

            if (op == 0) {
                union(a, b);
            } else {
                sb.append(find(a) == find(b) ? "YES\n" : "NO\n");
            }
        }

        System.out.print(sb);
    }

    static int find(int x) {
        if (parent[x] != x) parent[x] = find(parent[x]);
        return parent[x];
    }

    static void union(int a, int b) {
        int rootA = find(a);
        int rootB = find(b);
        if (rootA != rootB) parent[rootB] = rootA;
    }
}

βœ” find ν•¨μˆ˜λŠ” 경둜 압좕을 μ΄μš©ν•΄ λΆ€λͺ¨λ₯Ό μž¬κ·€μ μœΌλ‘œ μ΅œμƒμœ„ 루트둜 κ°±μ‹ ν•©λ‹ˆλ‹€.

βœ” union ν•¨μˆ˜λŠ” 두 μ›μ†Œμ˜ 루트λ₯Ό μ°Ύμ•„μ„œ λ³‘ν•©ν•©λ‹ˆλ‹€.

βœ” μž…λ ₯이 많기 λ•Œλ¬Έμ— BufferedReader와 StringBuilderλ₯Ό μ‚¬μš©ν•˜μ—¬ μž…μΆœλ ₯ μ„±λŠ₯을 μ΅œμ ν™”ν•©λ‹ˆλ‹€.

 


 

🎯 결둠

 

이 λ¬Έμ œλŠ” Union-Find μ•Œκ³ λ¦¬μ¦˜μ„ μ—°μŠ΅ν•˜κΈ°μ— κ°€μž₯ μ ν•©ν•œ λ¬Έμ œμž…λ‹ˆλ‹€.

특히 경둜 μ••μΆ• 없이 ν’€λ©΄ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•˜λ―€λ‘œ, find()에 κΌ­ μ΅œμ ν™”λ₯Ό μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

πŸ‘‰πŸΌ μ„œλ‘œμ†Œ μ§‘ν•© 문제λ₯Ό ν’€ λ•ŒλŠ” 항상 λ‹€μŒ 두 κ°€μ§€λ₯Ό 염두에 λ‘μž:

 

  1. find()μ—λŠ” 경둜 압좕을!
  2. union()μ—λŠ” λŒ€ν‘œλ…Έλ“œ 병합을!
 

 

'Algorithm & Data Structures > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

b4195. μΉœκ΅¬λ„€νŠΈμ›Œν¬  (0) 2025.05.08
b1976. μ—¬ν–‰κ°€μž  (0) 2025.05.06
b4803. 트리  (0) 2025.04.28
b2263. 트리의 순회  (0) 2025.04.28
b11780. ν”Œλ‘œμ΄λ“œ 2  (0) 2025.04.25
'Algorithm & Data Structures/BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • b4195. μΉœκ΅¬λ„€νŠΈμ›Œν¬
  • b1976. μ—¬ν–‰κ°€μž
  • b4803. 트리
  • b2263. 트리의 순회
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (306) N
      • Algorithm & Data Structures (232) N
        • BOJ (91) N
        • SWEA (1)
        • Programers (136)
        • Data Structures (3)
      • DB (21)
        • SQL (15)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • λ„€νŠΈμ›Œν¬ (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    νˆ¬ν¬μΈν„°
    ν›„μœ„μˆœνšŒ
    κ³¨λ“œ
    μœ„μƒμ •λ ¬
    PriorityQueue
    λ°±νŠΈλž˜ν‚Ή
    κ΅¬ν˜„
    Java
    μ•Œκ³ λ¦¬μ¦˜
    DynamicProgramming
    이뢄탐색
    μŠ€νƒ
    binarySearch
    algorithm
    Union-Find
    Stack
    BFS
    baekjoon
    unionfind
    μ „μœ„μˆœνšŒ
    μœ λ‹ˆμ˜¨νŒŒμΈλ“œ
    dfs
    λ™μ κ³„νšλ²•
    ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
    λ°±μ€€
    dp
    programmers
    κ²½λ‘œμ••μΆ•
    λ‹€μ΅μŠ€νŠΈλΌ
    Dijkstra
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Geisha
b1717. μ§‘ν•©μ˜ ν‘œν˜„
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”