문제 풀이 날짜: 2023.08.23
포스트 작성일: 2023.08.26
* 학습 목적으로 작성하는 글입니다. 풀이가 정석적이지 못할 수도 있습니다.
문제 출처
SWEA 3289번: 서로소 집합 (D4)
키워드
유니온 파인드
풀이 접근법
- 집합의 연산(합집합, 트리의 부모 찾기)을 구현하는 기본적인 문제이다.
- 유니온 파인드 알고리즘은 크게 makeSet(), union(), find() 세 함수로 나눠 구현한다.
- makeSet()
- 자기만을 원소로 갖는 단위 서로소 집합을 생성한다. parents가 자기 자신을 가리키게 만들면 된다.
- union()
- 두 원소의 부모가 같지 않다면 같은 집합으로 합친다.
- 집합을 합치는 것은 한 노드(a)의 부모를 나머지 노드(b) 또한 부모로 가리키도록 만들어주면 된다. (같은 부모를 가리킴)
- find()
- 어떤 노드 a의 부모를 재귀적으로 찾는다.
- 매개변수로 들어온 노드가 부모로 자기 자신을 가리키면 그것이 하위 노드의 부모로 리턴시킨다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
private static int N;
private static int M;
private static int[] parents;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int test_case = 1; test_case <= T; test_case++) {
String[] temp = br.readLine().split(" ");
N = Integer.parseInt(temp[0]);
M = Integer.parseInt(temp[1]);
makeSet();
sb.append("#").append(test_case).append(" ");
StringTokenizer st;
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine(), " ");
int ope = Integer.parseInt(st.nextToken());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if(ope == 0) {
union(a, b);
} else if (ope == 1) {
if(find(a) == find(b)) {
sb.append(1);
} else sb.append(0);
}
}
sb.append("\n");
}
System.out.println(sb);
}
private static void union(int a, int b) {
int aRoot = find(a);
int bRoot = find(b);
if(aRoot == bRoot) return; //두 요소가 같은 집합에 속해있다면
//bRoot 이하의 집합을 aRoot 아래로 붙인다.
parents[bRoot] = aRoot;
}
private static int find(int a) {
if(a == parents[a]) return a;
parents[a] = find(parents[a]);
return parents[a];
}
// 모든 요소는 자기만을 원소로 갖는 단위 서로소 집합임.
private static void makeSet() {
parents = new int[N + 1];
for(int i = 0; i <= N; i++) {
parents[i] = i;
}
}
}
git 링크
(git 링크 첨부)
'Study > Problem Solving' 카테고리의 다른 글
| [SWEA / Java] 1251번: 하나로 (D4) (0) | 2023.08.26 |
|---|---|
| [백준 / Java] 17471번: 게리맨더링 (골드4) (0) | 2023.08.26 |
| [백준 / Java] 2252번: 줄 세우기 (골드3) (0) | 2023.08.23 |
| [백준 / Java] 1987번: 알파벳 (골드4) (0) | 2023.08.23 |
| [백준 / Java] 1074번: Z (실버1) (0) | 2023.08.21 |