Home 너비 우선 탐색(BFS) - JAVA
Post
Cancel

너비 우선 탐색(BFS) - JAVA

너비 우선 탐색

너비 우선 탐색은 영어로 BFS (Breadth First Search) 라 표현하며, 그래프를 탐색하는데 너비를 우선으로 하여 탐색한다는 뜻이다. BFS 탐색을 위해선 스택을 사용한 DFS와 달리 라는 자료구조가 필요하다. 큐를 사용한 BFS 탐색 방법은 아래와 같다.

BFS 순서

  1. 시작노드를 큐에 담는다.
  2. 큐에 넣은 값을 빼며 방문하지 않은 인접한 노드 전부를 큐에 저장한다.
  3. 큐가 empty 가 될때까지 2번 과정을 반복한다.
  4. 큐가 비게되면 탐색이 종료된다.

예시

예시로 그래프가 아래와 같을 경우 (무방향 그래프, 숫자가 낮은 노드부터 탐색)

무방향그래프

BFS로 탐색을 진행한다면 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 9 -> 8 순 으로 탐색을 진행하게 된다.

코드

DFS 탐색을 코드로 구현할 땐 재귀를 사용하여 구현하거나 스택을 사용하여 구현한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package pjh5365.graph;

import java.util.LinkedList;
import java.util.Queue;

public class BFS {

    static boolean[] visited = new boolean[10];  // 9번 노드까지 있으므로 0빼고 사용하기 위해 10개 필요
    static int[][] graph = {    // 배열별로 자신이 가르키는 노드를 가짐 (양방향 그래프임)
            {}, // 0번 사용하지 않음
            {2, 3, 4},  // 1번 노드가 가르키는 노드는 2, 3, 4
            {1},  // 2번 노드가 가르키는 노드는 1
            {1, 5}, // 3번 노드가 가르키는 노드는 1, 5
            {1}, // 4번 노드가 가르키는 노드는 1
            {3, 6, 7},  // 5번 노드가 가르키는 노드는 3, 6, 7
            {5, 9},    // 6번 노드가 가르키는 노드는 5, 9
            {5}, // 7번 노드가 가르키는 노드는 5
            {9},  // 8번 노드가 가르키는 노드는 9
            {6, 8}  // 9번 노드가 가르키는 노드는 6, 8
    };

    public static void main(String[] args) {
        System.out.println("\nBFS 탐색");
        bfs(1);
        System.out.println();
    }

    static void bfs(int start) {
        Queue<Integer> queue = new LinkedList<>();  // 사용할 큐 선언

        queue.add(start);   // 큐에 시작점 입력
        visited[start] = true;  // 방문표시
        System.out.print(start + " -> "); // 방문확인을 위한 출력
        while(!queue.isEmpty()) {  // 큐가 빌때까지 반복
            int now = queue.poll(); // 큐의 값 빼서 가져오기
            for(int i = 0; i < graph[now].length; i++) {   // 가져온 노드의 인접노드 전부를 탐색
                if(!visited[graph[now][i]]) { // 방문되지 않았다면
                    queue.add(graph[now][i]); // 큐에 삽입
                    visited[graph[now][i]] = true;    // 방문 표시
                    System.out.print(graph[now][i] + " -> ");   // 방문확인을 위한 출력
                }
            }
        }
    }
}

결과는 아래와 같이 나온다.

실행결과

This post is licensed under CC BY 4.0 by the author.