문제 출처: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWBJKA6qr2oDFAWr&categoryId=AWBJKA6qr2oDFAWr&categoryType=CODE&problemTitle=%EC%84%9C%EB%A1%9C%EC%86%8C&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
private static int[] parents;
private static void makeSet(int N) {
parents = new int[N + 1];
for (int i = 1; i < N + 1; i++) {
parents[i] = i;
}
}
private static int findSet(int n) {
if (n == parents[n]) return n;
return parents[n] = findSet(parents[n]);
}
private static boolean unionSet(int a, int b) {
int aRoot = findSet(a);
int bRoot = findSet(b);
if (aRoot == bRoot) return false;
parents[bRoot] = aRoot;
return true;
}
private static int isSameSet(int a, int b) {
int aRoot = findSet(a);
int bRoot = findSet(b);
return aRoot == bRoot ? 1 : 0;
}
public static void main(String[] args) throws Exception {
StringBuilder sb = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(reader.readLine());
for (int i = 0; i < T; i++) {
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
int N = Integer.parseInt(tokenizer.nextToken());
int M = Integer.parseInt(tokenizer.nextToken());
makeSet(N);
sb.append("#").append(i + 1).append(" ");
for (int j = 0; j < M; j++) {
tokenizer = new StringTokenizer(reader.readLine());
int process = Integer.parseInt(tokenizer.nextToken());
int a = Integer.parseInt(tokenizer.nextToken());
int b = Integer.parseInt(tokenizer.nextToken());
switch (process) {
case 0:
unionSet(a, b);
break;
case 1:
sb.append(isSameSet(a, b));
break;
}
}
sb.append("\n");
}
System.out.println(sb);
}
}
- Union-Find 알고리즘을 활용하는 아주 기본적인 문제였다.
- makeSet() 메서드를 통해 각각 하나씩 집합을 만들어주고, findSet() 메서드를 통해 매개변수로 주어지는 인자의 대표자를 찾고, unionSet()을 통해 매개변수로 주어지는 두 인자가 속한 집합을 합치는 연산을 구현하였다.