본문 바로가기
백준_JAVA

[백준] 1717번 - 집합의 표현

by stonage 2023. 5. 24.

 

 

1717번: 집합의 표현

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

www.acmicpc.net

 

 

 

유니온 파인드 개념을 이해하고 적용해볼 수 있는 문제이다. 유니온 파인드 개념은 아래 글을 참고하자.

 

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

Union Find - 유니온 파인드 - 그래프 자료구조에서 주로 사용하는 알고리즘 - 두 노드가 같은 그래프에 속하는지 판별 - 서로소 집합(Disjoin-Set)으로도 불린다. - 노드를 합치는 Uion 연산과 노드의 루

stonage.tistory.com

 

 

 

유니온 파인드는 그래프에 속하는 두 정점이 연결되어 있는지 판별할 때 사용할 수 있는 알고리즘의 한 종류이다. 이 문제는 유니온 파인드를 구현하면된다. 유니온 파인드는 find와 union 두 연산이 사용되는데 find는 두 요소가 같은 집합에 포함되어 있는지 확인할 때 부모 노드를 반환하는 함수이고 union은 두 요소를 같은 집합에 포함시키는 함수이다.

 

find와 union을 구현하는 방법은 위 링크의 게시글을 만들 때 해보았으므로 이번 문제에 대한 전체 코드만 남기도록 하겠다.

 

 

 

 

 

전체 코드

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));
        String[] input = br.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);
        
        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++) {
            input = br.readLine().split(" ");
            
            int check = Integer.parseInt(input[0]);
            int a = Integer.parseInt(input[1]);
            int b = Integer.parseInt(input[2]);
            
            
            if (check == 0) 
            	merge(a, b);
            else if (check == 1)
            	sb.append(((find(a) == find(b)) ? "YES" : "NO") + "\n");
            else 
            	continue;
        }
        
        System.out.println(sb);
        
        br.close();
    }
    
    static int find (int num) {
        if (parent[num] == num) return num;
        return parent[num] = find(parent[num]);
    }
    
    static void merge (int a, int b) {
    	
    	a = find(a);
    	b = find(b);
    	
    	if (a != b) {
    		if (a < b) parent[b] = a;
    		else parent[a] = b;
    	}
    }
}

 

'백준_JAVA' 카테고리의 다른 글

[백준] 1991번 - 트리 순회  (0) 2023.05.25
[백준] 6497번 - 전력난  (0) 2023.05.24
[백준] 1197번 - 최소 스패닝 트리  (0) 2023.05.23
[백준] 9372번 - 상근이의 여행  (0) 2023.05.23
[백준] 12865번 - 평범한 배낭  (0) 2023.05.22