코딩테스트

BFS - 자바(JAVA)

3은 2023. 2. 6. 03:54
728x90

BFS는 너비우선 탐색이다.

그래프를 완전 탐색하는 방법 중 하나로, 시작 노드에서 출발해 시작 노드를 기준으로 가까운 노드를 먼저 방문하면서 탐색하는 알고리즘이다. 

 

기능 특징 시간복잡도
그래프 완전 탐색 FIFO(선입선출)
Queue 자료구조 이용
O(V + E)

 

● 너비 우선 탐색은 선입선출 방식으로 탐색하므로 Queue를 이용해 구현한다.

 시작 노드를 기준으로 가까운 노드를 먼저 방문하기 때문에 도착하는 경로가 여러 개일 때 최단경로를 보장한다.

 

핵심이론

1. BFS를 시작할 노드 정한 후 사용할 자료구조 초기화

- 방문했던 노드는 다시 방문하지 않으므로 방문한 노드를 체크하기 위한 배열이 필요하다.

- 자료구조는 Queue를 사용한다.

 

2.  Queue에서 노드를 꺼낸 후 꺼낸 노드의 인접 노드를 다시 Queue에 삽입한다.

- Queue에서 노드를 꺼내면서 인접 노드를 다시 Queue에 삽입한다. 

- 이때 방문 배열을 체크해서 이미 방문한 노드는 다시 Queue에 삽입하지 않는다.

- 탐색 순서가 필요하면 Queue에서 노드를 꺼내면서 순서를 기록한다. 

 

3. Queue에 남은 노드가 없을 때까지 반복한다.

 

 

코드

private static void BFS(int node) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(node);
        visted[node] = ture;
        while(!queue.isEmpty()) {
            int now_node = queue.poll();
            System.out.println(now_node + "");
            for(int i : A[now_node]){
                if(!visted[i]) {
                    queue.add(i);
                    visted[i] = ture;
                }
            }
        }
    }