자료구조 & 알고리즘(Data Structure & Algorithm)/알고리즘(Python)
깊이우선탐색(DFS)/너비우선탐색(BFS)
Itscool
2022. 2. 14. 17:49
탐색(Search)이란?
- 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정
- 대표적인 그래프 탐색 알고리즘으로는 DFS(Depth-First Search)와 BFS(Breadth-First Search)가 있음
- DFS/BFS는 코딩테스트 빈출유형이므로 반드시 숙지해야 함
DFS(Depth-First Search)란?
- 깊이우선탐색이라고도 부르며 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
- 스택 자료구조(혹은 재귀함수)를 사용
- 동작 과정
- 탐색 시작 노드를 스택에 push, 방문 처리
- 스택 최상단에 방문하지 않은 인접한 노드가 있으면 push, 방문 처리(단, 방문하지 않은 노드가 없으면 pop)
- 더 이상 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)
visited_s = [False] * 9
graph_s = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
dfs(graph_s, 1, visited_s)
BFS(Breadth-First Search)란?
- 너비우선탐색이라고도 부르며 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘
- 큐 자료구조 이용
- 동작 과정
- 탐색 시작 노드를 큐에 push, 방문 처리
- 큐에서 노드를 pop, 해당 노드의 인접노드 중 방문하지 않은 노드를 모두 큐에 push하고 방문처리
- 더 이상 2. 의 과정을 수행할 수 없을 때까지 반복
from collections import deque
def bfs(graph, start, visited):
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
visited_s = [False] * 9
graph_s = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
bfs(graph_s, 1, visited_s)