์ ๋์จ ํ์ธ๋ ๋ฌธ์
1. ๋ด ๋ถ๋ชจ๊ฐ ๋๊ตฌ์ธ์ง ๋ด๋ ๋ฐฐ์ด parent[i]์ ์ผ๋จ ๋ ์์ ์ผ๋ก ์ด๊ธฐํ ํ๋ค.
2. ํ์ธ๋
- ๋ด ๋ถ๋ชจ๊ฐ ์ ๋ง ์ต์์ ๋ถ๋ชจ์ธ์ง ๊ณ์ ์ฐพ์ ๋๊ฐ๋ฉด์, ์ต์์๊ฐ ์๋ ๋์๋ ์์์ ๋ถ๋ชจ๋ก ๊ฐ์ ๊ต์ฒดํ๋ค.
private static int find(int x) {
if(parent[x]==x) return x;
else return parent[x] = find(parent[x]);
}
3. ์ ๋์จ
- ๋ ์ซ์์ ๋ถ๋ชจ๋ฅผ ํ์ธํด์, ๋ถ๋ชจ ๊ฐ์ด ๋ค๋ฅด๋ค๋ฉด ๋ถ๋ชจ ๊ฐ์ a๋ b์ ๋ถ๋ชจ๊ฐ์ผ๋ก ๊ต์ฒดํด์ค๋ค. ์ด๋ค ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๋ฃ์ ๊ฒ์ธ์ง๋ ์๊ด์๋ค.
private static void union(int a, int b) {
a = find(a);
b = find(b);
if(a!=b) {
parent[b] = a;
}
}
์ ์ฒด ์ฝ๋
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
static int[] parent;
static int n;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String[] str = br.readLine().trim().split(" ");
n = Integer.parseInt(str[0]);
int m = Integer.parseInt(str[1]);
parent = new int[n+1];
for(int i=0;i<=n;i++) {
parent[i] = i;
}
int k, a,b;
for(int x=0;x<m;x++) {
str = br.readLine().trim().split(" ");
k = Integer.parseInt(str[0]);
a = Integer.parseInt(str[1]);
b = Integer.parseInt(str[2]);
switch (k) {
case 0:
union(a,b);
break;
case 1:
if( find(a) == find(b) ) sb.append("YES\n");
else sb.append("NO\n");
break;
}
}
System.out.println(sb.toString().trim());
}
private static int find(int x) {
if(parent[x]==x) return x;
else return parent[x] = find(parent[x]);
}
private static void union(int a, int b) {
a = find(a);
b = find(b);
if(a!=b) {
parent[b] = a;
}
}
}
์ฒ์์๋ ๋ถ๋ชจ๊ฐ์ ๋ฐ๊ฟ์ฃผ์ด์ผ ํ ๋, ๊ธฐ์กด ๋ถ๋ชจ๊ฐ๊ณผ ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง ๋ชจ๋ ์์๋ค์ ์ฐพ์์ ๋ถ๋ชจ๊ฐ์ ๋ฐ๊ฟ์ฃผ๋ ค๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด parent[7] = 1์ด๊ณ , ๋ถ๋ชจ๊ฐ์ 6์ผ๋ก ๋ฐ๊ฟ์ฃผ์ด์ผ ํ๋ ์ํฉ์์ ๋ถ๋ชจ๊ฐ์ 1๋ก ๊ฐ์ง๋ ๋ชจ๋ ์์์ ์ฐพ์ผ๋ ค๊ณ ๋งค๋ฒ for๋ฌธ์ ๋๋ ธ๋๋ ์ฝ๊ฐ ๋น์ฐํ๊ฒ๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค. ๊ทผ๋ฐ ์๊ฐํด๋ณด๋ ๊ตณ์ด for๋ฌธ์ ๋๋ ค์ ๋ค ๋ฐ๊ฟ์ค ํ์๊ฐ ์์๋ค.
๋ฌธ์ ์ ์์๋ก ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
(์์์์๋ ์ ๋์จ ์์ a์ b ์ค a์ ๋ถ๋ชจ๊ฐ์ผ๋ก ํต์ผ์์ผ์ค๋ค. )
0) ์ด๊ธฐ parent ๋ฐฐ์ด
์๋ ๊ฐ์ ์๊ธฐ ์์ ์ผ๋ก ์ธํ ๋์ด ์๋ค.
| ๋ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| ๋ถ๋ชจ๊ฐ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1) 0 1 3
3์ ๋ถ๋ชจ๊ฐ์ด 1๋ก ๋ฐ๋๋ค.
| ๋ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| ๋ถ๋ชจ๊ฐ | 1 | 2 | 1 | 4 | 5 | 6 | 7 |
2) 0 7 6
6์ ๋ถ๋ชจ๊ฐ์ด 7๋ก ๋ฐ๋๋ค.
| ๋ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| ๋ถ๋ชจ๊ฐ | 1 | 2 | 1 | 4 | 5 | 7 | 7 |
3) 0 3 7
7์ ๋ถ๋ชจ๊ฐ์ด 1๋ก ๋ฐ๋๋ค.
| ๋ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| ๋ถ๋ชจ๊ฐ | 1 | 2 | 1 | 4 | 5 | 7 | 1 |
์ด๋ฐ ์ํฉ์์ 3๊ณผ 6์ด ๊ฐ์ ์งํฉ์ธ์ง ๋ฌผ์ด๋ดค์ ๋, parent[3]=1์ด๊ณ parent[6]=7์ด๋๊น ๋น์ฐํ ๋ชป ์ฐพ์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ค. ํ์ง๋ง find()๋ก์ง์ ๋ณด๋ฉด parent[x]=x, ์ฆ ๋์ ๋ถ๋ชจ๊ฐ์ด ๊ฐ์ ๋์๋ง x๊ฐ์ ๋ฆฌํดํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ๋ค์ find()๋ฅผ ํธ์ถํด์ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ parent[x]์ ์ง์ด๋ฃ๊ฒ ๋์ด์๋ค.
๋ค์ ๋งํด, find(6)์ ํ๋ฉด ์๋ ์์์ ๋ฐ๋ผ์ ๊ฒฐ๊ตญ parent[6]=parent[7]=parent[1]=1์ด ๋๋ค. ์ด์ฐจํผ ๋์ ๋ถ๋ชจ๊ฐ์ด ๊ฐ์ ๋๊น์ง find()์์ ํ๊ณ ํ๊ณ ๋ด๋ ค๊ฐ๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ for๋ฌธ ํตํด์ ๋ถ๋ชจ๊ฐ์ ๋ฐ๊ฟ์ค ํ์๋ ์๊ณ , ๋ง์ฐฌ๊ฐ์ง ์ด์ ๋ก a๋ b์ ๋ถ๋ชจ๊ฐ์ค ์ด๋ค ๋ถ๋ชจ๊ฐ์ ์ ํํด๋ ์๊ด์ด ์๋ค.
| ํธ์ถ์์ | ||
| 3 | return parent[1]=1 | //parent[x]=x์ด๊ธฐ ๋๋ฌธ์ 1์ ๋ฆฌํดํ๋ค |
| 2 | else return parent[7]=find(parent[1]) | //์ฌ๊ธฐ์ parent[7]=1๋ก ๊ฐ์ด ๊ต์ฒด๋๋ค |
| 1 | else return parent[6]=find(parent[6]) =7 |
//์ฌ๊ธฐ์ parent[6]์ ๊ฐ๋ 1๋ก ๊ต์ฒด๋๋ค |
์ ์ฒด์ฝ๋
'์๊ณ ๋ฆฌ์ฆ > ๋ฌธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์๋ฐ] 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด์ญ - #3 ๋ถ๋ ์ฌ์ฉ์ (0) | 2021.01.02 |
|---|---|
| [์๋ฐ] ๋ฐฑ์ค 1976 - ์ฌํ ๊ฐ์ (0) | 2021.01.02 |
| [์๋ฐ] ๋ฐฑ์ค 1956 - ์ด๋ (0) | 2020.12.24 |
| [์๋ฐ] ๋ฐฑ์ค 11404 - ํ๋ก์ด๋ (0) | 2020.12.19 |
| [์๋ฐ] ๋ฐฑ์ค 2206 - ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ (0) | 2020.12.12 |