๐ [ํ๋ก๊ทธ๋๋จธ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด] level3 dfs/bfs ๋คํธ์ํฌ ๋ฌธ์ ํ์ด
๐ ๋ฌธ์
https://programmers.co.kr/learn/courses/30/lessons/43162
๋คํธ์ํฌ๋ ์ปดํจํฐ ์ํธ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ตํํ ์ ์๋๋ก ์ฐ๊ฒฐ๋ ํํ๋ฅผ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ปดํจํฐ A์ ์ปดํจํฐ B๊ฐ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด์๊ณ , ์ปดํจํฐ B์ ์ปดํจํฐ C๊ฐ
์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ ๋ ์ปดํจํฐ A์ ์ปดํจํฐ C๋ ๊ฐ์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์ ๋ณด๋ฅผ ๊ตํํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ปดํจํฐ A, B, C๋ ๋ชจ๋ ๊ฐ์ ๋คํธ์ํฌ ์์ ์๋ค๊ณ ํ ์ ์์ต๋๋ค.
์ปดํจํฐ์ ๊ฐ์ n, ์ฐ๊ฒฐ์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด computers๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋,
๋คํธ์ํฌ์ ๊ฐ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์์ค.
๐ ์ ๊ทผ๋ฒ
์ค๋์ ๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ์ด ์๋ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ์ ๋๋ค.
๊ทธ๋ํ ๋ฌธ์ ์ ์ ํ์ ๋๋ค.
์ ๋ ฅ์ด ์ด๋ฏธ ์ธ์ ํ๋ ฌ๋ก ์ฃผ์ด์ง์ง๋ง
์ธ์ ๋ฆฌ์คํธ๋ก ๋ง๋ค์ด์
bfs / dfs ํ์์ ํตํด ํ์ด๋ณด์์ต๋๋ค.
bfs / dfs ํ์ ๋ชจ๋ ๊ตฌํํด๋ณด์๊ณ
bfs ์ด๋ dfs ์ด๋ ๋์ค ํ๋๋ฅผ ์ด์ฉํด ๊ทธ๋ํ์ ๊ฐ์ (๋คํธ์ํฌ์ ๊ฐ์)๋ฅผ
๊ตฌํ ์ ์์ต๋๋ค.
๐ป ์ฝ๋
import java.util.*;
class Solution {
static boolean visited[];
static List<List<Integer>> adjList;
static Queue<Integer> queue;
static int count = 0;
public int solution(int n, int[][] computers) {
int answer = 0;
visited = new boolean[n];
adjList = new ArrayList<>();
for(int i=0; i<n; i++){
adjList.add(new ArrayList<Integer>());
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(i==j){
continue;
}
if( computers[i][j]==1){
adjList.get(i).add(j);
}
}
}
for(int i=0; i<n; i++){
if(visited[i] == false){
dfs(i);
count++;
}
}
return count;
}
public void bfs(int x){
queue = new LinkedList<>();
queue.offer(x);
visited[x] = true;
while(!queue.isEmpty()){
int a = queue.poll();
List<Integer> list = adjList.get(a);
for(int i=0; i<list.size(); i++){
int v = list.get(i);
if(visited[v]==false){
queue.offer(v);
visited[v] = true;
}
}
}
}
public void dfs(int x){
if(visited[x]) {return;}
visited[x] = true;
List<Integer> list = adjList.get(x);
for(int i=0; i<list.size(); i++){
int v = list.get(i);
if(visited[v] == false){
dfs(v);
}
}
}
}