DFS, BFS 구현

DFS

  • 깊이우선탐색
  • Stack
  • 백트래킹 ( =DFS + 가지치기로, 모든 경우의 수를 검색하지만 확률이 없는 경우는 잘라내는 기법)

BFS

  • 너비우선탐색
  • Queue
  • 가중치가 없는 그래프에서 최단거리 구하기

DFS, BFS 구현

문제는 백준1260번을 풀면서 코드를 짜보았다. dfs, bfs는 막상 보면 아! 이랬었지 해도 잘 까먹는 알고리즘이라서 정리 해놔야겠다고 생각했다.

문제를 보고 구현한 전체 소스는 DFS와BFS 여기를 참고하면 된다.

static void dfs(int v) { //stack

        Stack<Integer> stack = new Stack<Integer>();

        // 1. 반드시 data structure에 넣고 visit 체크!
        stack.push(v);
        visited[v] = true;

        System.out.print(" " + v);

        boolean flag = false;

        // 2. data structure 다 빌 때까지
        while(!stack.isEmpty()) {
            int vv = stack.peek();

            flag = false;

            // 3. 연결된 모든 노드에 대해서 찾으려고 반복
            for(int i = 1; i <= n ;i++) {

                if(graph[vv].contains(i) && !visited[i]) {
                    stack.push(i);

                    System.out.print(" " + i);

                    visited[i] = true;
                    flag = true;
                    break;
                }
            }

            // 4. 갈 곳이 없으면 되돌아가서 다른 노드를 살펴야하니
            if(!flag) {
                stack.pop();
            }

        }


    }


    static void bfs(int v) { //queue

        Queue<Integer> queue = new LinkedList<Integer>();

        // 1. 반드시 data structure에 넣고 visit 체크!
        queue.offer(v);
        visited[v] = true;

        // 2. data structure 다 빌 때까지
        while(!queue.isEmpty()) {

            // 3. 일단 Retrieves and removes head (돌아가지 않아도 됨)
            v = queue.poll();

            System.out.print( " "+v);

            // 4. 연결된 모든 노드를 다 넣고 visit 체크
            for(int i = 1 ; i <=n ; i++) {
                if(graph[v].contains(i) && !visited[i]) {
                    queue.offer(i);
                    visited[i] = true;
                }
            }
        }
    }

개인적으로

dfs든 bfs든 모든 노드를 방문해보는 것에 의의가 있다고 생각한다. 일단

  1. visit 배열
  2. stack이든 queue이든 담을 데이터 구조
  3. 데이터 구조가 빌 때 까지(while !strct.isEmpty)
  4. 첫 노드에서 뻗어나가는 모든 노드 검색 (for i..n)

이렇게 기억하면 될 것 같다!


Written by@heeye
Work for a financial company as a Backend developer & Cloud engineer😌

GitHub