코테/백준

[백준/JAVA] 1717번: 집합의 표현

imname1am 2023. 4. 28. 15:15
반응형

🔺 문제

 

1717번: 집합의 표현

초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작

www.acmicpc.net

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import java.util.*;
import java.io.*;
 
public class Main {
    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()," ");
        
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        parent = new int[n + 1];
        
        // 배열 초기화
        for(int i = 1 ; i <= n ; i++) {
            parent[i] = i;
        }
        
        // 입력 받기
        for(int i = 0 ; i < m ; i++) {
            st = new StringTokenizer(br.readLine()," ");
            
            int uf = Integer.parseInt(st.nextToken());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            
            // UNION 진행
            if(uf == 0) {
                union(a, b);
            }
            else {
                if(checkSame(a, b)) System.out.println("YES");
                else                System.out.println("NO");
            }
        }
    }
    
    // UNION : 집합을 1개로 합침
    public static void union(int a, int b) {
        a = find(a);
        b = find(b);
        
        if(a != b) {
            parent[b] = a;
        }
    }
    
    // FIND : 속한 집합의 대표 노드 반환
    public static int find(int a) {
        if(a == parent[a])  return a;
        else                return parent[a] = find(parent[a]); // 경로 압축
    }
    
    // 두 원소가 같은 집합인지 확인
    public static boolean checkSame(int a, int b) {
        a = find(a);
        b = find(b);
        
        if(a == b) {
            return true;
        }
        return false;
    }
}
cs
✅ 해결 아이디어
유니온파인드
- 재귀함수 형태로 경로 압축 효과 → 시간복잡도 : O(1)

 

💥 유의사항

⇨ find 연산 수행 시 :  a가 대표 노드가 아니라면, 대표 노드 값을 find(parent[a])값으로 저장 - 재귀형태

 


🔺 다른 풀이들

- union할 때 x<y 인 경우와 그게 아닌 경우로 나눠주심.

 

[BOJ] 백준 1717번 : 집합의 표현 (JAVA)

문제 초기에 {0}, {1}, {2}, ... {n} 이 각각 n+1개의 집합을 이루고 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그

steady-coding.tistory.com


💬 느낀 점

이해하니 재밌구나...

 

 

1회독 2회독 3회독 4회독 5회독
V 6/22      

 

 

(+ 6/22 2회독)

다른 문제에 비하면... 너는 골드 치고 쉽구나.. 고맙다..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.util.*;
import java.io.*;
 
public class Main {
    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(), " ");
        StringBuilder sb = new StringBuilder();
        
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        
        parent = new int[n + 1];
        for(int i = 1 ; i <= n ; i++) {
            parent[i] = i;
        }
        
        while(m --> 0) {
            st = new StringTokenizer(br.readLine(), " ");
            
            int num = Integer.parseInt(st.nextToken());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            
            if(num == 0) {
                union(a, b);
            }
            else {
                sb.append(find(a) == find(b) ? "YES" : "NO").append("\n");
            }
        }
 
        System.out.println(sb);
    }
    
    static void union(int a, int b) {
        a = find(a);
        b = find(b);
        
        if(a != b)  parent[b] = a;
    }
    
    static int find(int a) {
        if(a == parent[a])  return a;
        return parent[a] = find(parent[a]);
    }
}
 
cs


(참고)

✔ Do it 알고리즘 코딩테스트 자바편

✔ 유니온 파인드

 

[알고리즘] 유니온 파인드 (Union-Find)

유니온 파인드(Union-Find) ① 유니온 파인드란? ▷ 대표적 그래프 알고리즘으로 '합집합 찾기'라는 의미를 가지고 있습니다.▷ 상호 배타적 집합(Disjoint-set)이라고도 합니다.▷ 여러 노드가 존재할

brenden.tistory.com

 

반응형