๐Ÿ“– [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด] 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);
            }
        }
    }
}

Written on January 12, 2021