Union-Find๋ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ ๋๋ค. ํฉ์งํฉ ์ฐพ๊ธฐ ๋๋ ์๋ก์ ์งํฉ(Disjoint-Set) ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
๊ฐ์ ๊ทธ๋ํ ๋ด์ ํ์ธํ๊ณ ์ถ์ ๋ ธ๋๋ค์ด ์๋์ง ํ์ธํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
Union-Find๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด์ด ์กด์ฌํด์ผ ํฉ๋๋ค.
์ฒ์์๋ ๋ชจ๋ ๊ฐ์ด ์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํค๋๋ก ๋ง๋ญ๋๋ค.
ํ์ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ฆฌ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
๋ ธ๋ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
๋ ธ๋์ ๋ถ๋ชจ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
์ดํ 2๊ฐ์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ๋ ์์ ๊ฐ์ผ๋ก ๋ถ๋ชจ ๋ ธ๋ ๋ฐฐ์ด ๊ฐ์ ๋ฐ๊ฟ์ค๋๋ค.
๋ง์ฝ 1๊ณผ 2๊ฐ ์ฐ๊ฒฐ๋์๋ค๊ณ ํ๋ฉด 2์ ๋ถ๋ชจ ๋ ธ๋ ์๋์ ๊ฐ์ด 1๋ก ๋ฐ๋๋๋ค.
๋ถ๋ชจ์ ๊ฐ์ด ๊ฐ์์ง์ผ๋ก์จ ๋ ธ๋๋ค์ ํฉ์น ์ ์์ต๋๋ค. (Union ์๊ณ ๋ฆฌ์ฆ)
๋ ธ๋ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
๋ ธ๋์ ๋ถ๋ชจ | 1 | 1 | 3 | 4 | 5 | 6 | 7 | 8 |
์ดํ 2์ 3๋ ์ฐ๊ฒฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
๋ ธ๋ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
๋ ธ๋์ ๋ถ๋ชจ | 1 | 1 | 2 | 4 | 5 | 6 | 7 | 8 |
์ต์ข ์ ์ผ๋ก 1, 2, 3 ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์๋๋ฐ 1๊ณผ 3์ ๋ถ๋ชจ ๋ ธ๋๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ๋์ด ์๋์ง ์ ์ ์์ต๋๋ค. ์ด๋ฅผ ํ์ ํ๊ธฐ ์ํด์๋ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํฉ๋๋ค. ๋ ธ๋์ ๋ ธ๋์ ๋ถ๋ชจ ๊ฐ์ด ๊ฐ์ ๋๊น์ง ์ฐ๊ฒฐ ํ์ธ์ ๋ฐ๋ณตํฉ๋๋ค.
Find ์๊ณ ๋ฆฌ์ฆ์ ๋ ๊ฐ์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ํ์ธํ์ฌ ํ์ฌ ๊ฐ์ ์งํฉ์ ์ํ๋์ง ํ์ธํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
์๋๋ Union-Find ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ ๊ตฌํ ์ฝ๋์ ๋๋ค.
#include <stdio.h>
// ๋ถ๋ชจ ๋
ธ๋๋ฅผ ์ฐพ๋ ํจ์
int getParent(int parent[], int x) {
if(parent[x] == x) return x;
return parent[x] = getParent(parent, parent[x]);
}
// ๋ ๋ถ๋ชจ ๋
ธ๋๋ฅผ ํฉ์น๋ ํจ์
int unionParent(int parent[], int a, int b) {
a = getParent(parent, a);
b = getParent(parent, b);
if(a < b) parent[b] = a;
else parent[a] = b;
}
// ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง๋์ง ํ์ธ
int findParent(int parent[], int a, int b) {
a = getParent(parent, a);
b = getParent(parent, b);
if(a == b) return 1;
return 0;
}
int main(void) {
int parent[11];
for(int i = 0; i <= 10; i++) {
parent[i] = i;
}
unionParent(parent, 1, 2);
unionParent(parent, 2, 3);
unionParent(parent, 3, 4);
unionParent(parent, 5, 6);
unionParent(parent, 6, 7);
unionParent(parent, 7, 8);
printf("1๊ณผ 5๋ ์ฐ๊ฒฐ๋์ด ์๋์? %d\n", findParent(parent, 1, 5));
unionParent(parent, 2, 8);
printf("1๊ณผ 5๋ ์ฐ๊ฒฐ๋์ด ์๋์? %d\n", findParent(parent, 1, 5));
}
Reference
https://blog.naver.com/ndb796/221230967614
17. Union-Find(ํฉ์งํฉ ์ฐพ๊ธฐ)
Union-Find(์ ๋์จ-ํ์ธ๋)๋ ๋ํ์ ์ธ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๋ฐ๋ก 'ํฉ์งํฉ ์ฐพ๊ธฐ'๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง ์...
blog.naver.com
'Coding Test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ13549_์จ๋ฐ๊ผญ์ง3 (0) | 2022.09.21 |
---|---|
BOJ 1717: ์งํฉ์ ํํ (0) | 2022.07.22 |
2022 ์๋ฐ๊ธฐ ์ผ์ฑSDS ์ฝ๋ฉํ ์คํธ ํ๊ธฐ (0) | 2022.07.22 |
<C/C++> BOJ 15683 ๊ฐ์ (0) | 2022.05.06 |
<C/C++> BOJ 12100 2048(Easy) (0) | 2022.05.04 |