기타/코딩테스트

(코테) 백준_1717_집합의 표현 *유니온 파인드

불광동 물주먹 2025. 5. 29. 22:14

 

package test;
import java.util.*;
import java.io.*;

public class Backjun_1717Test {
	static int N,M;
	static int[] parents ;
	
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		//	기본 세팅
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st= new StringTokenizer(br.readLine());
		 N = Integer.parseInt(st.nextToken());
		 M = Integer.parseInt(st.nextToken());
		 parents = new int[N+1];
		// parents 1로 기본 세잍
		 for(int i =0;i<N+1;i++) {
			 parents[i] = i;			 
		 }
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<M;i++) {
			st= new StringTokenizer(br.readLine());
			
			int input = Integer.parseInt(st.nextToken()); 			
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			if(input==0) {  //0이면 합치기
				union(a,b);
			}else{ //1이면 체크 후 yes no 처리
					//찾아서 최상위 부모 같은지 확인.
					if(find(a)==find(b)) {
						sb.append("YES\n");
				
					}else {
						sb.append("NO\n");

					}
				}					
		}
		System.out.println(sb);
		
	}
	public static int find(int num) {
		//최상위 부모 찾기
			if(parents[num]==num) return parents[num]; //자기가 최상위 루트면 자기값 반환
			
			return parents[num] = find(parents[num]); // 자기 값이 아니다? 그럼 최상위 부모 찾는 재귀 함수 자기가 최상위 부모다? 그럼 그 값 리턴	
		
		
		
	}

	public static void union(int x, int y) {
		int a = find(x);  //루트
		int b = find(y);  //루트
		
		 // if() {} //값 체크 해야하나??? 다 해주면 되나 헷갈리네
		if(a!=b) {
		parents[b] = a;  //최상위 부모로 합치기 		
		}
	}
	
	
}