Notice
250x250
Recent Posts
Recent Comments
Link
넘치게 채우기
[알고리즘] 2-2. 너비 우선 탐색(BFS) 본문
728x90
반응형
BFS
BFS(Breadth First Search)는 너비 우선 탐색으로, 가까운 노드부터 탐색하는 알고리즘이다.
BFS에서는 큐 자료구조를 이용하여 구현한다. 인접한 노드들 중 방문하지 않은 노드를 큐에 추가하면 가까운 노드부터 탐색하는 것이다.
동작 방식은 다음과 같다:
1. 탐색 시작 노드를 큐에 넣고, 방문처리한다.
2. 큐에서 노드를 꺼내 큐의 인접 노드들 중 방문하지 않은 모든 노드들을 큐에 삽입하고, 순서대로 방문처리한다.
3. 2번의 과정을 계속해서 반복한다.
노드 '1'부터 시작해서 '1'을 큐에 넣고 방문처리한다.
노드 '1'을 큐에서 꺼내고, '1'의 인접 노드들 중 방문하지 않은 노드들을 모두 큐에 넣고 방문처리한다.
노드 '2'를 큐에서 꺼내고, 2에 인접한 노드들 중 방문하지 않은 노드인 '5'를 큐에 넣고 방문처리한다.
노드 '3'을 큐에서 꺼내고, '3'에 인접한 노드들 중 방문하지 않은 '7'을 큐에 넣고 방문처리한다.
노드 '4'를 큐에서 꺼내고, '4'의 인접 노드들 중 방문하지 않은 '8'을 큐에 넣고 방문처리한다.
노드 '5'를 큐에서 꺼내고, 인접 노드들 중 방문하지 않은 '6'을 큐에 넣고 방문처리한다.
큐에 남은 노드들의 방문하지 않은 인접노드가 없으므로 큐를 전부 꺼낸다.
방문 순서(큐에 들어간 순서)는 다음과 같다:
1 -> 2 -> 3 -> 4 -> 5 -> 7 -> 8 -> 6
코드(Python)
from collections import deque
def bfs(graph, start, visited):
q = deque([start])#시작 노드를 큐에 넣는다
visited[start] = True#방문처리한다
while q:#큐에 노드가 있는 동안:
v = q.popleft()#제일 먼저 들어온 노드를 빼서
print(v, end = ' ')
for i in graph[v]:#인접 노드들 중 방문하지 않은 노드들을 큐에 넣고 방문처리한다
if not visited[i]:
q.append(i)
visited[i] = True
#그래프의 정보(인접 노드들)
graph = [[],
[2, 3, 4],
[1, 5],
[1, 7],
[1, 8],
[2, 6],
[5],
[3, 8],
[4, 7]]
#방문 정보
visited = [False] * 9
#1부터 너비우선탐색
bfs(graph, 1, visited)
결과
1 2 3 4 5 7 8 6
728x90
반응형
'컴퓨터과학 > 알고리즘' 카테고리의 다른 글
[알고리즘] 5. 탐욕법(Greedy) (0) | 2023.04.29 |
---|---|
[알고리즘] 4. 동적 계획법(Dynamic Programming) (0) | 2023.04.29 |
[알고리즘] 3. 정렬(Sort) (0) | 2023.04.21 |
[알고리즘] 2-1. 깊이 우선 탐색(DFS) (0) | 2023.04.18 |
[알고리즘] 1. 재귀 함수(Recursion) (0) | 2023.04.17 |