DFS(Depth-First Search, 깊이 우선 탐색)
그래프에서 깊은 부분을 우선적을 탐색하는 알고리즘. 스택(stack)을 사용한다!
동작 과정:
- 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
- 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 방문 처리를 한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
- 2번의 과정을 더 이상 수행할 수 없을 때까지 반복한다.
2번 과정에서 방문하지 않은 인접 노드를 스택에 넣을 때 순서는 상관없지만, 문제에 따라서 알파벳 순서 또는 작은 숫자 순서대로 가는 경우가 많으므로 작은 노드 순서대로 넣는 경우가 많다.
그럼 실습해보자!!
def dfs(graph, v, visited):
# 현재 노드 방문 처리
visited[v] = True
print(v, end=' ')
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
[],
[2, 3],
[1, 5],
[1, 4],
[3],
[2, 6, 7],
[1, 5],
[5]
]
# 각 노드가 방문된 정보를 리스트 자료형으로 표현(1차원 리스트)
visited = [False] * 8
# DFS 호출
dfs(graph, 1, visited)
### 출력 결과(stack에 들어간 순서대로): 1 2 5 6 7 3 4
BFS(Breath-First Search, 너비 우선 탐색)
가까운 노드부터 탐색하는 알고리즘. 큐(queue)를 사용한다!
동작 과정:
- 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
- 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리를 한다.
- 2번의 과정을 더 이상 수행할 수 없을 때까지 반복한다.
BFS와 마찬가지로 작은 노드부터 수행하는 경우가 많다!
위에 있는 그래프를 이용하여 다시 실습해보자!
from collections import deque
# BFS 정의
def bfs(graph, start, visited):
# queue 구현 위해 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
# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
[],
[2, 3],
[1, 5],
[1, 4],
[3],
[2, 6, 7],
[1, 5],
[5]
]
# 각 노드가 방문된 정보를 리스트 자료형으로 표현(1차원 리스트)
visited = [False] * 8
# BFS 호출
bfs(graph, 1, visited)
### 출력 결과(큐에 삽입된 순서대로): 1 2 3 5 4 6 7
'코테 > DFS, BFS' 카테고리의 다른 글
[DFS/BFS] 백준 7576 토마토 (0) | 2022.06.07 |
---|---|
[DFS/BFS] 백준 2606 바이러스(DFS 풀이) (0) | 2022.06.06 |
[DFS/BFS] 미로 탈출 (0) | 2022.06.04 |
[DFS/BFS] 음료수 얼려 먹기 (0) | 2022.06.03 |