본문 바로가기
Algorithm/이것이 코딩테스트다

[Python][이코테] BFS

by 애기 개발자 2022. 8. 2.
반응형

BFS

BFS - Breadth First Search

너비 우선 탐색 알고리즘이다.

 

즉 가까운 노드부터 탐색하는 알고리즘이라고 할 수 있다.

 

BFS는 선입선출 방식인 '' 방식을 주로 이용한다.

 

인접한 노드를 반복적으로 큐에 넣도록 알고리즘을 작성하면 자연스럽게 먼저 들어온 것이 나가게 되어, 가까운 노드부터 탐색을 진행하게 된다.

 

동작 방식은 다음과 같다.

  1. 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
  2. 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리를 한다.
  3. 2번 과정을 더이상 수행할 수 없을 때까지 반복한다.

 

 

1. 시작 노드인 1을 큐에 삽입하고 방문처리한다. 

1              

 

2. 큐에서 노드 1을 꺼내고 방문하지 않은 인접노드 2, 3, 8을 모두 큐에 삽입하고 방문처리한다.

  2 3 8        

 

3. 큐에서 노드 2를 꺼내고 방문하지 않은 인접 노드 7을 큐에 삽입하고 방문처리한다.

    3 8 7      

 

4. 큐에서 3을 꺼내고 방문하지 않은 인접 노드 4와 5를 모두 큐에 삽입하고 방문처리한다.

      8 7 4 5  

 

5. 큐에서 8을 꺼내고 방문하지 않은 인접 노드가 없으므로 무시한다.

        7 4 5  

 

6. 큐에서 노드 7을 꺼내고 방문하지 않은 인접노드 6을 큐에 삽입하고 방문처리한다.

          4 5 6

 

7. 남아있는 노드에 방문하지 않은 인접 노드가 없다. 따라서 모든 노드를 차례대로 꺼내면 끝

 

1 → 2 → 3 → 8 → 7 → 4 → 5 → 6

 

위의 동작 순서를 가지기 때문에 deque 라이브러리를 사용하는 것이 좋으며 보통  O(N)의 시간이 소요된다.

 

일반적인 경우 실제 수행 시간은 DFS보다 좋은 편이다.

 

# 5-9 DFS,BFS BFS 예제

from collections import deque

def bfs(graph, start, visited):
    # 큐 구현을 위해 deque 라이브러리 사용
    queue = deque([start])
    
    # 현재 노드를 방문 처리
    visited[start] = True
    
    # 큐가 빌 때까지 반복
    while queue:
        # 큐에서 하나의 원소를 뽑아 출력
        v = queue.popleft()
        print(v, end=' ')
        
        # 해당 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

visited = [False] * 9

bfs(graph, 1, visited)
반응형

댓글