반응형

1. BFS(Breadth First Search; 너비 우선 탐색)의 개념

 그래프에서 모든 노드를 한번씩 탐색하기 위한 방법

■ 루트 노드[또는 임의의 노드]에서 시작하여, 형제(sibling) 노드를 탐색한 후, 각 레벨에 있는 노드를 차례대로 탐색하는 방법.

■ Queue를 이용하여 구현

 

2. BFS 노드 방문 순서

■ 결과 : 1 → 2 → 3 → 4 → 7 → 8 → 9 → 5 → 6 → 10

    - step1) 루트 노드에서 시작하여, 같은 레벨에 있는 모든 노드를 탐색하고 큐에 추가한다.

    - step2) 큐에서 하나씩 노드를 꺼내면서 그 노드와 연결된 인접 노드를 탐색하고, 탐색된 노드는 큐에 추가한다.

    - step3) 큐가 빌 때까지 step1과 step2를 반복하며 모든 노드를 탐색한다.

 

3. 그래프 표현

 "그래프"는 "인접 리스트"로 표현하여 보다 이해하기 쉬운 형태로 만들 수 있다.

1 2, 3
2 1, 4
3 1, 7, 8, 9
4 2, 5, 6
5 4
6 4
7 3, 10
8 3
9 3
10  

 

■ "인접 리스트"는 "2차원 배열[리스트]" 또는 "테이블[dictionary]" 자료구조로 코드화 한다.

1
2
3
4
5
6
7
8
9
10
11
12
let graph = []
graph['0'= []         // index 0: 사용하지 않음.
graph['1'= ['2''3']
graph['2'= ['1''4']
graph['3'= ['1''7''8''9']
graph['4'= ['2''5''6']
graph['5'= ['4']
graph['6'= ['4']
graph['7'= ['3''10']
graph['8'= ['3']
graph['9'= ['3']
graph['10'= ['7']
cs

 

4. JavaScript 코딩

- JavaScript로 구현한 Queue 참고: https://languagestory.tistory.com/400

 

큐(Queue) 구현 및 테스트 (JavaScript, Python)

1.  Queue 개념■ 선입선출 (FIFO): 큐에서 데이터는 먼저 들어온 순서대로 출력된다.■ enqueue: 큐에 데이터를 삽입하는 작업■ dequeue: 큐에서 데이터를 제거하는 작업■ Front: 큐의 앞쪽 (데이터가

languagestory.tistory.com

 

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
46
47
48
// 'queue.js' 파일에서 Queue 클래스를 가져옴
const Queue = require('./queue.js');
 
// BFS 알고리즘 구현
const bfs = (graph, currNode, visited) => {
 
    // Queue 인스턴스를 생성하여 사용
    const queue = new Queue();
 
    // 시작 노드를 큐에 추가하고 방문처리
    queue.enqueue(currNode);
    visited[currNode] = true;
 
    // 큐가 비어있지 않으면 계속해서 탐색
    while (queue.getLength() > 0) {         // 큐가 빌 때까지 반복
        const nextNode = queue.dequeue();   // 큐에서 하나의 노드를 꺼냄 (이 노드를 탐색)
        console.log(nextNode);               // 현재 노드를 출력 (탐색한 노드)
 
        // 꺼낸 노드의 인접 노드들을 탐색
        for (const neighborNode of graph[nextNode]) {
            // 방문하지 않은 인접 노드가 있으면 큐에 추가하고 방문처리
            if (!visited[neighborNode]) {
                queue.enqueue(neighborNode);  // 큐에 인접 노드를 추가
                visited[neighborNode] = true// 해당 노드를 방문했다고 표시
            }
        }
    }
}
 
// 그래프의 연결 정보 (인접 리스트 형태로 표현)
const graph = [
    [],                 // 0번 노드: 사용하지 않음
    [234],          // 1번 노드: 2, 3, 4번 노드와 연결
    [1],                // 2번 노드: 1번 노드와 연결
    [156],          // 3번 노드: 1, 5, 6번 노드와 연결
    [17],             // 4번 노드: 1, 7번 노드와 연결
    [38],             // 5번 노드: 3, 8번 노드와 연결
    [3],                // 6번 노드: 3번 노드와 연결
    [4],                // 7번 노드: 4번 노드와 연결
    [5]                 // 8번 노드: 5번 노드와 연결
]
 
// 방문 여부를 체크하는 배열 (그래프 크기만큼 false로 초기화)
const visited = Array(graph.length).fill(false);    
 
// 1번 노드부터 BFS 탐색 시작
bfs(graph, 1, visited);     // 1번 노드부터 BFS 탐색
 
cs

 

반응형

+ Recent posts