반응형
BFS
BFS - Breadth First Search
너비 우선 탐색 알고리즘이다.
즉 가까운 노드부터 탐색하는 알고리즘이라고 할 수 있다.
BFS는 선입선출 방식인 '큐' 방식을 주로 이용한다.
인접한 노드를 반복적으로 큐에 넣도록 알고리즘을 작성하면 자연스럽게 먼저 들어온 것이 나가게 되어, 가까운 노드부터 탐색을 진행하게 된다.
동작 방식은 다음과 같다.
- 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
- 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리를 한다.
- 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)
반응형
'Algorithm > 이것이 코딩테스트다' 카테고리의 다른 글
[Python][이코테] 미로 탈출 (1) | 2022.08.05 |
---|---|
[Python][이코테] 음료수 얼려 먹기 (0) | 2022.08.02 |
[Python][이코테] DFS (0) | 2022.08.01 |
[Python][이코테] 재귀함수/팩토리얼재귀 (0) | 2022.07.20 |
[Python][이코테] 스택 & 큐 (0) | 2022.07.20 |
댓글