[BOJ] 백준 1717번 : 집합의 표현 (JAVA)
문제
초기에 {0}, {1}, {2}, ... {n} 이 각각 n+1개의 집합을 이루고 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
입력
첫째 줄에 n(1≤n≤1,000,000), m(1≤m≤100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다.
합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다. a와 b는 n 이하의 자연수 또는 0이며 같을 수도 있다.
출력
1로 시작하는 입력에 대해서 한 줄에 하나씩 YES/NO로 결과를 출력한다. (yes/no 를 출력해도 된다)
풀이
유니온 파인드의 기초 문제였습니다. 혹시나 유니온 파인드를 모르시는 분은 아래 포스팅을 꼭 읽어보시길 바랍니다.
쉽게 말하면, 각 노드마다 부모가 어떤 노드인지 설정해 주는 작업이라고 생각하면 됩니다.
처음에 parent 배열은 parent[i] = i 형태로 자기자신을 가리키고 있습니다.
그리고 문제의 입력을 받으면서 0일 경우 합집합 연산을 하고, 1일 경우 교집합 여부 확인을 합니다.
위 포스팅에서 합집합 연산에 해당하는 것이 union이고, 교집합 여부 확인에 해당하는 것이 isSameParent입니다.
두 함수를 그대로 구현하시면 됩니다.
아래는 위 내용을 정리한 소스코드입니다.
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int[] parent;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
parent = new int[N + 1];
for (int i = 1; i <= N; i++) {
parent[i] = i;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int command = Integer.parseInt(st.nextToken());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if (command == 0) {
union(a, b);
} else if (command == 1) {
sb.append((isSameParent(a, b) ? "YES" : "NO") + "\n");
} else {
continue;
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
// x의 부모를 찾는 연산
public static int find(int x) {
if (x == parent[x]) {
return x;
}
return parent[x] = find(parent[x]);
}
// y의 부모를 x의 부모로 치환하는 연산 (x > y 일 경우, 반대)
public static void union(int x, int y) {
x = find(x);
y = find(y);
if (x != y) {
if (x < y) {
parent[y] = x;
} else {
parent[x] = y;
}
}
}
// x와 y의 부모가 같은지 확인
public static boolean isSameParent(int x, int y) {
x = find(x);
y = find(y);
if (x == y) {
return true;
}
return false;
}
}
|
cs |
지적 혹은 조언 환영합니다! 언제든지 댓글로 남겨주세요.
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 10216번 : Count Circle Groups (JAVA) (0) | 2020.08.05 |
---|---|
[BOJ] 백준 1976번 : 여행 가자 (JAVA) (0) | 2020.08.04 |
[BOJ] 백준 1602번 : 도망자 원숭이 (JAVA) (0) | 2020.08.03 |
[BOJ] 백준 1238번 : 파티 (JAVA) (0) | 2020.08.03 |
[BOJ] 백준 1507번 : 궁금한 민호 (JAVA) (0) | 2020.08.03 |
댓글