그래프에서 원하는 데이터를 찾는 알고리즘
코딩 테스트에서 매우 자주 등장한다
그래프는 2차원 배열, 인접행렬 등으로 표현할 수 있다.
대표적인 알고리즘: DFS, BFS

: 깊이 우선 탐색
: 스택 자료구조 / 재귀 함수를 이용
1 → 2 → 7 → 6 → 8 → 3 → 4 → 5 (숫자가 작은 경우 우선 탐색)
def dfs(n, graph, visited):
visited[n] = True # 방문 처리
print(n, end=' ')
for adj in graph[n]: # 인접 노드
if not visited[adj]: dfs(adj, graph, visited)
# 그래프를 표현하기 위해 2차원 리스트 사용
# 각 노드가 연결된 정보를 표현
graph = [[], [2, 3, 8], [1, 7], [1, 4, 5], [3, 5], [3, 4], [7], [2, 6, 8], [1, 7]]
visited = [False] * len(graph)
dfs(1, graph, visited) # 1 2 7 6 8 3 4 5
: 너비 우선 탐색
1 → 2 → 3 → 8 → 7 → 4 → 5 → 6
: 1번 노드로부터 거리가 가까운 노드부터 방문
from collections import deque
def bfs(start, graph, visited):
queue = deque([start])
visited[start] = True
while queue:
n = queue.popleft()
print(n, end=' ')
for adj in graph[n]: # 인접 노드
if not visited[adj]:
queue.append(adj)
visited[adj] = True # 방문 처리
graph = [[], [2, 3, 8], [1, 7], [1, 4, 5], [3, 5], [3, 4], [7], [2, 6, 8], [1, 7]]
visited = [False] * len(graph)
bfs(1, graph, visited) # 1 2 3 8 7 4 5 6