
๋ฌธ์ ๋งํฌ
๊ตฌ๋ฆLEVEL
๋์ด๋๋ณ ๋ค์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํจ์ผ๋ก์จ SW ์ญ๋์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
level.goorm.io
๋ฌธ์ ์ค๋ช

์ ๋ ฅ

์ถ๋ ฅ
N๊ฐ์ ์ฌ ์ฌ์ด์ ์กด์ฌํ๋ ์ฐํฉ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ์ดํด
์๋ฐฉํฅ์ ํ์ธํ๋ ๊ฒ๊น์ง๋ ์ฝ๊ฒ ๊ตฌํ์ ํ๊ณ ์ดํ BFS๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ค ์ธํฐ๋ท์ ๋ค๋ฅธ ์ฌ๋๋ค์ ํด๊ฒฐ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ค๊ฐ Union - Set ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ์ฝ๋๊ฐ ํฅ๋ฏธ๋ก์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์๋ค.
1. ์ด๊ธฐ ์ ๋ ฅ์ ๋จ๋ฐฉํฅ์ด๋ค.
2. ์๋ฐฉํฅ์ธ์ง ๊ฒ์ฌํด์ค ํ (3) BFS๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, (4) parent ๋ฐฐ์ด(์ฐํฉ ์ ๋ณด)์ ๋ง๋ค์ด ์ฐํฉ์ root๋ฅผ ์ ์ฅํ๋ค.
3.BFS
3-1. ์๋ฐฉํฅ์ธ๊ฑธ ์ด๋ฏธ ๊ฒ์ฆํ์ผ๋, ๊ทธ๋ํ ๊ฐ ์ฐ๊ฒฐ์ ํ์ธํด๋ณด๋ฉด ๋๋ค.
3-2. ๊ทธ๋ํ์ ์ฐ๊ฒฐ ํ์ธ์ด ๋ชจ๋ ๋๋๋ฉด ๋ฐฉ๋ฌธํ๋ ์ฌ๋ค์ ๋ค ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ํด ์ค ๋ค, ์ฐํฉ์ ๊ฐ์๋ฅผ 1 ์ฌ๋ ค์ค๋ค.
4.Union-Set
4-1. N ํฌ๊ธฐ๋งํผ parent ๋ฐฐ์ด์ ๋ง๋ค์ด์ฃผ๊ณ , ์๊ธฐ ์์ ์ ๋ฒํธ๋ฅผ ์ ์ฅํ๋ค.
4-2. findํจ์์ unionํจ์๋ฅผ ์ ์ํด ๊ฐ์ ์ฐํฉ์ ๋ชจ๋ ๊ฐ์ ๋ฒํธ๋ก ๋ง๋ค์ด์ค๋ค.
4-3. parent์ ์กด์ฌํ๋ ์ซ์ ์ข ๋ฅ์ ๊ฐ์๊ฐ ์ฐํฉ์ ๊ฐ์์ด๋ค.
๋ฌธ์ ํด๊ฒฐ
1. find ํจ์์ unionํจ์๋ฅผ ์ ์ํ๋ค.
int find(int x){
if(x == parent[x]){
return x;
}
else{
int temp = x;
while(temp != parent[temp]){
temp = parent[temp];
}
return temp;
}
}
void island_union(int x, int y){
int tx = find(x);
int ty = find(y);
if (tx > ty)
parent[tx] = ty;
else
parent[ty] = tx;
}
2. ์๋ฐฉํฅ์ธ๊ฑธ ํ์ธํ๋ฉด union ํจ์๋ฅผ ์คํํ๋ค.
for(int i = 1; i <= n; i++){
for(int j : island[i]){
if(find(island[j].begin(), island[j].end(), i) != island[j].end())
island_union(i,j);
}
}
3. ์ฐํฉ์ ๊ฐ์๋ฅผ ๋ง๋ค์ด์ค set ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ค.
set<int> u;
for(int i = 1; i <= n; i++){
u.insert(find(i));
}
๋ฌธ์ ํ๊ธฐ
๊ฐ์ธ์ ์ผ๋ก๋ ์ด๋ฒ ๋ฌธ์ ๊ฐ ์ฑ๋ฆฐ์ง๋ฅผ ํ๋ฉด์ ์ ์ผ ์ด๋ ค์ ๋ ๊ฒ ๊ฐ๋ค. ์ฒ์์จ๋ณด๋ Union-Set์๊ณ ๋ฆฌ์ฆ์ ์ด ๊ฒ ์ด์ ์ธ ๊ฒ ๊ฐ์๋ฐ, Union-Set ์๊ณ ๋ฆฌ์ฆ์ ์ถํ์ ๋ฐ๋ก ์ ๋ฆฌํ์ฌ ๋ฐ๋ก ํฌ์คํ ํ ์์ ์ด๋ค. ์ถ๊ฐ๋ก ์์ฌ์ ๋ ์ ์ ๋ง์ง๋ง set์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๊ณผ์ ์์ find(i)๋ฅผ ์ฐ๋ ๊ฒ๊ณผ parent[i]๋ฅผ ์ฐ๋ ๊ฒ์ด ๋ฌด์จ ์ฐจ์ด๊ฐ ์๋์ง๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ค. ์ฐจ์ด์ ์ ์๊ฒ ๋๋ฉด ๋ฐ๋ก ์์ ํด์ ์์ฑํ ์์ ์ด๋ค.
์ ์ฒด ์ฝ๋
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
vector<vector<int>> island(2001);
int parent[2001];
set<int> u;
int n,m;
void init(){
for(int i = 1; i <= n; i++)
parent[i] = i;
}
int find(int x){
if(x == parent[x]){
return x;
}
else{
int temp = x;
while(temp != parent[temp]){
temp = parent[temp];
}
return temp;
}
}
void island_union(int x, int y){
int tx = find(x);
int ty = find(y);
if (tx > ty)
parent[tx] = ty;
else
parent[ty] = tx;
}
int main(){
cin >> n >> m;
int f,s;
for(int i = 0; i < m; i++){
cin >> f >> s;
island[f].push_back(s);
}
init();
int count = 0;
for(int i = 1; i <= n; i++){
for(int j : island[i]){
if(find(island[j].begin(), island[j].end(), i) != island[j].end())
island_union(i,j);
}
}
for(int i = 1; i <= n; i++){
u.insert(find(i));
cout << parent[i] << " " << find(i) << endl;
}
cout << u.size();
}
'Algorithm > ๊ตฌ๋ฆ ์ฑ๋ฆฐ์ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ตฌ๋ฆํค ์ฑ๋ฆฐ์ง] 4์ฃผ์ฐจ ํ์ต ์ผ๊ธฐ #2 (20์ผ์ฐจ) & ํ๊ธฐ (0) | 2023.09.09 |
---|---|
[๊ตฌ๋ฆํค ์ฑ๋ฆฐ์ง] 3์ฃผ์ฐจ ํ์ต ์ผ๊ธฐ #2 (14์ผ์ฐจ) (0) | 2023.09.01 |
[๊ตฌ๋ฆํค ์ฑ๋ฆฐ์ง] 3์ฃผ์ฐจ ํ์ต ์ผ๊ธฐ #1 (11์ผ์ฐจ) (0) | 2023.08.28 |
[๊ตฌ๋ฆํค ์ฑ๋ฆฐ์ง] 2์ฃผ์ฐจ ํ์ต ์ผ๊ธฐ #2 (8์ผ์ฐจ) (0) | 2023.08.24 |
[๊ตฌ๋ฆํค ์ฑ๋ฆฐ์ง] 2์ฃผ์ฐจ ํ์ต ์ผ๊ธฐ #1 (6์ผ์ฐจ) (0) | 2023.08.22 |