[백준] 1717 집합의 표현

Hyun·2025년 8월 27일
0

백준

목록 보기
107/123

문제

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

집합을 표현하는 프로그램을 작성하시오.

입력

첫째 줄에 nn, mm이 주어진다. mm은 입력으로 주어지는 연산의 개수이다. 다음 mm개의 줄에는 각각의 연산이 주어진다. 합집합은 00 aa bb의 형태로 입력이 주어진다. 이는 aa가 포함되어 있는 집합과, bb가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 11 aa bb의 형태로 입력이 주어진다. 이는 aabb가 같은 집합에 포함되어 있는지를 확인하는 연산이다.

출력

1로 시작하는 입력에 대해서 aabb가 같은 집합에 포함되어 있으면 "YES" 또는 "yes"를, 그렇지 않다면 "NO" 또는 "no"를 한 줄에 하나씩 출력한다.

제한

1n10000001 ≤ n ≤ 1\,000\,000

1m1000001 ≤ m ≤ 100\,000

0a,bn0 ≤ a, b ≤ n

aa, bb는 정수

aabb는 같을 수도 있다.

예제 입력 1

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

예제 출력 1

NO
NO
YES

풀이

유니온 방식으로 풀이하였다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static int[] parent;
	static int n;
	static int m;
	
	static int findP(int x) {
		if(parent[x] != x) return parent[x] = findP(parent[x]);
		return parent[x];
	}
	
	static void union(int n1, int n2) {
		int p1 = findP(n1);
		int p2 = findP(n2);
		
		if(p1 < p2) {
			parent[p2] = p1;
		} else {
			parent[p1] = p2;
		}
	}

    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 = 1; i <= n; i++) parent[i] = i;
		
		for(int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine());
			int f = Integer.parseInt(st.nextToken());
			int m = Integer.parseInt(st.nextToken());
			int s = Integer.parseInt(st.nextToken());
			
			// 합집함 연산인 경우
			if(f == 0) {
				union(m, s);
			}
			else if(f == 1) {
				if(findP(m) == findP(s)) System.out.println("YES");
				else System.out.println("NO");
			}
		}

    }
}
profile
better than yesterday

0개의 댓글