ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/3๋‹จ๊ณ„

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : ๋„คํŠธ์›Œํฌ

Jaeguk 2022. 6. 20. 14:10
๋ฌธ์ œ ๋งํฌ

https://programmers.co.kr/learn/courses/30/lessons/43162

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋„คํŠธ์›Œํฌ

๋„คํŠธ์›Œํฌ๋ž€ ์ปดํ“จํ„ฐ ์ƒํ˜ธ ๊ฐ„์— ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํ“จํ„ฐ A์™€ ์ปดํ“จํ„ฐ B๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๊ณ , ์ปดํ“จํ„ฐ B์™€ ์ปดํ“จํ„ฐ C๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ

programmers.co.kr

์—ฌ๋Ÿฌ๋Œ€์˜ ์ปดํ“จํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ, ์„œ๋กœ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ๋“ค์˜ ๊ทธ๋ฃน์„ ๋„คํŠธ์›Œํฌ๋ผ๊ณ  ํ•œ๋‹ค.

๋„คํŠธ์›Œํฌ์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด๋ณด์ž.

 

  ํ’€์ด

์ปดํ“จํ„ฐ๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์ง€ ์•Š์•„๋„ ๊ฐ„์ ‘์ ์œผ๋กœ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์–ด๋„ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ์— ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋ฐฑ์ค€์— ์žˆ๋Š” ์œ ๊ธฐ๋†๋ฐฐ์ถ” ๋ฌธ์ œ์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ์ธ ๋“ฏํ•˜๋‹ค.

 

์ฐธ๊ณ  ๋งํฌ

https://www.acmicpc.net/problem/1012

 

1012๋ฒˆ: ์œ ๊ธฐ๋† ๋ฐฐ์ถ”

์ฐจ์„ธ๋Œ€ ์˜๋†์ธ ํ•œ๋‚˜๋Š” ๊ฐ•์›๋„ ๊ณ ๋žญ์ง€์—์„œ ์œ ๊ธฐ๋† ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋†์•ฝ์„ ์“ฐ์ง€ ์•Š๊ณ  ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋ ค๋ฉด ๋ฐฐ์ถ”๋ฅผ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋‚˜๋Š” ํ•ด์ถฉ ๋ฐฉ์ง€์— 

www.acmicpc.net

 

ํ•œ ์ง€์ ์—์„œ DFS๋กœ ํƒ์ƒ‰์„ ํ•ด์„œ ๋” ์ด์ƒ ์ด๋™ํ•˜์ง€ ๋ชปํ•  ๋•Œ ๊นŒ์ง€ ํƒ์ƒ‰์„ ํ–ˆ์„ ๋•Œ ์ด๋™ ๊ฒฝ๋กœ์ƒ์— ์žˆ์—ˆ๋˜ ๋…ธ๋“œ๋“ค์€ ๋ชจ๋‘ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์•ˆ์— ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฏธ ํƒ์ƒ‰๋œ ์ง€์ ์€ ์ค‘๋ณต๋ฐฉ๋ฌธ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด bool ํƒ€์ž…์˜ visited ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ๋ฐฉ๋ฌธํ‘œ์‹œ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  computers[i][j] == 1 ์ด๋ฉด i์™€ j๋Š” ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

(visited[j] && computer[i][j] == 1) ์ด๋ฉด ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด j์ปดํ“จํ„ฐ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <string>
#include <vector>
using namespace std;
const int MAX_N = 200 + 5;
bool visited[MAX_N];
 
void dfs(int now, int n, vector<vector<int>> computers){
    visited[now] = true;
    for(int i = 0; i < n; i++){
        if(!visited[i] && computers[now][i])
            dfs(i, n, computers);
    }
}
int solution(int n, vector<vector<int>> computers) {
    int answer = 0;
    for(int i = 0; i < n; i++){
        if(!visited[i]){
            dfs(i, n, computers);
            answer++;
        }
    }
    return answer;
}
cs

 

 

728x90