코테/백준
[백준/JAVA] 1717번: 집합의 표현
imname1am
2023. 4. 28. 15:15
반응형
🔺 문제
1717번: 집합의 표현
초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작
www.acmicpc.net
🔺 코드
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
|
import java.util.*;
import java.io.*;
public class Main {
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()," ");
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;
}
// 입력 받기
for(int i = 0 ; i < m ; i++) {
st = new StringTokenizer(br.readLine()," ");
int uf = Integer.parseInt(st.nextToken());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
// UNION 진행
if(uf == 0) {
union(a, b);
}
else {
if(checkSame(a, b)) System.out.println("YES");
else System.out.println("NO");
}
}
}
// UNION : 집합을 1개로 합침
public static void union(int a, int b) {
a = find(a);
b = find(b);
if(a != b) {
parent[b] = a;
}
}
// FIND : 속한 집합의 대표 노드 반환
public static int find(int a) {
if(a == parent[a]) return a;
else return parent[a] = find(parent[a]); // 경로 압축
}
// 두 원소가 같은 집합인지 확인
public static boolean checkSame(int a, int b) {
a = find(a);
b = find(b);
if(a == b) {
return true;
}
return false;
}
}
|
cs |
✅ 해결 아이디어
✔ 유니온파인드
- 재귀함수 형태로 경로 압축 효과 → 시간복잡도 : O(1)
💥 유의사항
⇨ find 연산 수행 시 : a가 대표 노드가 아니라면, 대표 노드 값을 find(parent[a])값으로 저장 - 재귀형태
🔺 다른 풀이들
- union할 때 x<y 인 경우와 그게 아닌 경우로 나눠주심.
[BOJ] 백준 1717번 : 집합의 표현 (JAVA)
문제 초기에 {0}, {1}, {2}, ... {n} 이 각각 n+1개의 집합을 이루고 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그
steady-coding.tistory.com
💬 느낀 점
이해하니 재밌구나...
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 6/22 |
(+ 6/22 2회독)
다른 문제에 비하면... 너는 골드 치고 쉽구나.. 고맙다..
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
|
import java.util.*;
import java.io.*;
public class Main {
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 = 1 ; i <= n ; i++) {
parent[i] = i;
}
while(m --> 0) {
st = new StringTokenizer(br.readLine(), " ");
int num = Integer.parseInt(st.nextToken());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if(num == 0) {
union(a, b);
}
else {
sb.append(find(a) == find(b) ? "YES" : "NO").append("\n");
}
}
System.out.println(sb);
}
static void union(int a, int b) {
a = find(a);
b = find(b);
if(a != b) parent[b] = a;
}
static int find(int a) {
if(a == parent[a]) return a;
return parent[a] = find(parent[a]);
}
}
|
cs |
(참고)
✔ Do it 알고리즘 코딩테스트 자바편
✔ 유니온 파인드
[알고리즘] 유니온 파인드 (Union-Find)
유니온 파인드(Union-Find) ① 유니온 파인드란? ▷ 대표적 그래프 알고리즘으로 '합집합 찾기'라는 의미를 가지고 있습니다.▷ 상호 배타적 집합(Disjoint-set)이라고도 합니다.▷ 여러 노드가 존재할
brenden.tistory.com
반응형