알고리즘/자료구조와 알고리즘

[Algorithm] BFS 알고리즘 (너비 우선 탐색)

정석이 2022. 1. 21. 15:44

 

BFS 알고리즘너비 우선 탐색 방법으로, 가까운 노드부터 우선적으로 탐색하는 알고리즘이다.

 

 

주로 Queue 자료구조를 이용하여 모든 노드를 탐색한다.

 

 

 

 

예시를 살펴보자

 

 

 

예시

 

 

 

예시 그래프~~!! 방문 기준은 번호가 낮은 인접 노드부터, 시작 노드는 1이라고 하자.

 

 

 

 

 

1부터 기

 

 

큐에 1 넣음

 

 

 

 

2

 

 

큐에 있던 1을 꺼내주고 인접 노드 2 3 8 을 넣어준다.

 

 

 

 

 

3

 

 

 2 3 8 에서 2를 꺼내주고 2와 인접한 노드 7을 넣어준다.

 

 

큐 : 3 8 7

 

 

 

 

4

 

 

3 8 7 에서 3을 빼주고 3과 인접한 노드 4, 5를 넣어준다.

 

 

큐 : 8 7 4 5

 

 

 

 

5

 

 

8 7 4 5에서 8을 빼주고 8과 인접한 노드는 모두 방문했으므로 추가x

 

 

큐 : 7 4 5

 

 

 

 

 

결론

 

 

 

7 4 5에서 7을 빼고 인접 노드 6을 들르면 모든 노드를 탐색하게 된다.

 

 

따라서 노드를 탐색하는 순서는 1 - 2 - 3 - 8 - 7 - 4 - 5 - 6 이 된다.

 

 

 

 

이를 코드로 나타내면

 

import java.util.*;

public class BFS {

    public static boolean[] visited = new boolean[9];
    public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();

    // BFS 함수 정의
    public static void bfs(int start) {
        Queue<Integer> q = new LinkedList<>();
        q.offer(start);
        // 현재 노드를 방문 처리
        visited[start] = true;
        // 큐가 빌 때까지 반복
        while(!q.isEmpty()) {
            // 큐에서 하나의 원소를 뽑아 출력
            int x = q.poll();
            System.out.print(x + " ");
            // 해당 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입
            for(int i = 0; i < graph.get(x).size(); i++) {
                int y = graph.get(x).get(i);
                if(!visited[y]) {
                    q.offer(y);
                    visited[y] = true;
                }
            }
        }
    }

    public static void main(String[] args) {
        // 그래프 초기화
        for (int i = 0; i < 9; i++) {
            graph.add(new ArrayList<Integer>());
        }

        // 노드 1에 연결된 노드 정보 저장 
        graph.get(1).add(2);
        graph.get(1).add(3);
        graph.get(1).add(8);
        
        // 노드 2에 연결된 노드 정보 저장 
        graph.get(2).add(1);
        graph.get(2).add(7);
        
        // 노드 3에 연결된 노드 정보 저장 
        graph.get(3).add(1);
        graph.get(3).add(4);
        graph.get(3).add(5);
        
        // 노드 4에 연결된 노드 정보 저장 
        graph.get(4).add(3);
        graph.get(4).add(5);
        
        // 노드 5에 연결된 노드 정보 저장 
        graph.get(5).add(3);
        graph.get(5).add(4);
        
        // 노드 6에 연결된 노드 정보 저장 
        graph.get(6).add(7);
        
        // 노드 7에 연결된 노드 정보 저장 
        graph.get(7).add(2);
        graph.get(7).add(6);
        graph.get(7).add(8);
        
        // 노드 8에 연결된 노드 정보 저장 
        graph.get(8).add(1);
        graph.get(8).add(7);

        bfs(1);
    }

}

 

 

가 된다. 큐 값이 빌 때까지 반복해준다.

 

 

 

 

 

출처 : 이것이 취업을 위한 코딩 테스트다 (https://www.youtube.com/watch?v=7C9RgOcvkvo&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=3)