๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๊ตฌ๋ฆ„ ์ฑŒ๋ฆฐ์ง€

[๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€] 4์ฃผ์ฐจ ํ•™์Šต ์ผ๊ธฐ #1 (16์ผ์ฐจ)

by ๋Œ€๋ณต2 2023. 9. 5.

๋ฌธ์ œ ๋งํฌ

 

๊ตฌ๋ฆ„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();
}