์ ๋์จ ํ์ธ๋ ๋ฌธ์
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 |