보글보글 개발일지
반응형

문제

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

 

1717번: 집합의 표현

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

www.acmicpc.net

풀이

유니온 파인드의 연습 문제

UNION

여러 노드가 있을 때 특정 2개의 노드를 연결해 1개의 집합으로 묶음

	private static void union(int a, int b) {
		//union 연산: 대표 노드까지 연결하기
		a = find(a);
		b = find(b);
		if(a!=b) {
			parent[b] = a;
		}
	}

FIND

두 노드가 같은 집합에 속해 있는지 확인 - 특정 노드 a에 관해 a가 속한 집합의 대표 노드 반환

재귀를 이용.

	private static int find(int a) {
		//재귀 함수의 형태로 구현 -> 경로 압축 부분
		if(a == parent[a])
			return a;
		else return parent[a] = find(parent[a]);
	}

코드

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

public class B1717_집합의표현 {
	public 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 = 0; i <= n; i++)
			parent[i] = i;
		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine());
			int question = Integer.parseInt(st.nextToken());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			if(question == 0) union(a,b);
			else {		
				if(checkSame(a,b)) sb.append("YES").append("\n");
				else sb.append("NO").append("\n");
			}
			
		}
		System.out.println(sb);
	}

	private static boolean checkSame(int a, int b) {
		//두 원소가 같은 집합인지 확인하기
		a = find(a);
		b = find(b);
		return a==b;
	}

	private static void union(int a, int b) {
		//union 연산: 대표 노드까지 연결하기
		a = find(a);
		b = find(b);
		if(a!=b) {
			parent[b] = a;
		}
	}

	private static int find(int a) {
		//재귀 함수의 형태로 구현 -> 경로 압축 부분
		if(a == parent[a])
			return a;
		else return parent[a] = find(parent[a]);
	}

}
반응형

'알고리즘' 카테고리의 다른 글

[백준/2178][Python] 미로찾기  (0) 2023.03.24
[백준/3109][Java] 빵집  (0) 2023.03.24
[백준/2178][Java] 미로탐색  (0) 2023.03.20
[백준/2606][Java] 바이러스  (0) 2023.03.20
[백준/13023][Java] ABCDE  (0) 2023.03.17
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!