반응형
문제
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 |