그래프를 깊이 우선 탐색(DFS)으로 탐색한 결과와 너비 우선 탐색(BFS)으로 탐색한 결과를 출력하는 문제입니다. 시작 정점 부터 방문하며, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문해야 합니다.
그래프 탐색의 가장 기본이 되는 두 가지 알고리즘을 하나의 그래프에 적용해 보는 문제입니다.
a에서 b로, b에서 a로 모두 연결해 줍니다.graph의 각 리스트 요소들을 sort()로 오름차순 정렬해 주는 것이 이 문제의 핵심 포인트입니다.collections 모듈의 deque를 사용해야 시간 초과를 방지할 수 있습니다.import sys
from collections import deque
input = sys.stdin.readline
N, M, V = map(int, input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
for i in range(1, N+1):
graph[i].sort()
visited_bfs = [False] * (N+1)
visited_dfs = [False] * (N+1)
def dfs(start_node):
visited_dfs[start_node] = True
print(start_node, end=' ')
for i in graph[start_node]:
if not visited_dfs[i]:
dfs(i)
def bfs(start_node):
queue = deque([start_node])
visited_bfs[start_node] = True
while queue:
v = queue.popleft()
print(v, end=' ')
for i in graph[v]:
if not visited_bfs[i]:
queue.append(i)
visited_bfs[i] = True
dfs(V)
print()
bfs(V)
deque 사용의 중요성: BFS를 구현할 때 일반 리스트(list)를 사용해서 pop(0)을 하게 되면, 맨 앞의 원소가 빠져나가면서 뒤에 있는 모든 원소들의 인덱스를 한 칸씩 앞으로 당겨야 하므로 의 시간 복잡도가 발생합니다. 반면 collections.deque의 popleft()는 만에 처리할 수 있어 코딩 테스트에서 BFS를 다룰 때는 무조건 deque를 사용해야 한다는 것을 다시금 명심했습니다.