공부공간

BOJ - 1717 ) 집합의 표현 본문

알고리즘/구현,시뮬

BOJ - 1717 ) 집합의 표현

개발자가될수있을까? 2020. 3. 22. 23:17

 


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

 

1717번: 집합의 표현

첫째 줄에 n(1≤n≤1,000,000), m(1≤m≤100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다. a

www.acmicpc.net


합집합의 연산을 반복하면서, 특정 두 원소가 같은 집합에 속해있는지를 묻는 문제이다.

 

이 문제는 "너 서로소집합 메소드 구현할줄알아?"라고 물어보는 문제이다.

 

Rank를 계산하여 Union연산을 하는 것(Rank Compression)은 일반 코테에 자주 나오지는 않지만, 

 

MST를 구성할 때 사용되는 크루스칼,프림알고리즘은 정형화 되어있어서 빠르게 습득하면 관련문제를

 

쉽게 풀수있다. 또한, Union연산시에, 경로 압축 ( Path Compression )을 통하여 합집합 연산을 해준다.

 


import java.util.Scanner;

public class Main {
	static int parent[];
	public static int find(int a) {
		if(parent[a] == a) return a;
		return find(parent[a]);
	}
	public static void union(int a , int b) {
		// 부모끼리 합친다.
		int pa = find(a);
		int pb = find(b);
		if(pa==pb) return;
		if(pa>pb) { parent[pb] = pa;}
		else { parent[pa] = pb;}
	}
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		parent = new int[n+1];
		for(int i = 0 ; i <= n ; i ++) parent[i] =i;
		for(int i = 0 ; i < m ; i ++) {
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		if(a == 0) {
			union(b,c);
		}else {
			if(find(b) == find(c)) {
				System.out.print("YES\n");
			}else {
				System.out.print("NO\n");
			}
		}
	}
	}
}

'알고리즘 > 구현,시뮬' 카테고리의 다른 글

프로그래머스 ) 지형이동  (1) 2020.04.29
BOJ - 1197 ) 최소 스패닝 트리  (1) 2020.04.09
BOJ - 14891 ) 톱니바퀴  (0) 2020.03.08
BOJ - 3190 ) 뱀  (0) 2020.03.07
BOJ - 13458 ) 시험감독  (0) 2020.03.07
Comments