학습 철학 회고
단순히 미로를 찾고 단지에 번호를 붙이는 1차원적인 풀이를 넘어, '그래프를 남김없이 탐색한다'는 본질적 목표를 어떻게 코드로 추상화할 것인지 고민했습니다. 특정 조건에 휘둘리지 않는, DFS와 BFS의 가장 순수하고 일반화된 뼈대(Skeleton)를 세웁니다.
데이터가 거미줄처럼 얽혀있는 그래프(Graph) 공간에서, 모든 정점을 단 한 번씩만, 누락 없이 방문하기 위한 두 가지 상반된 탐색 철학입니다.
탐색의 순서를 결정하는 것은 결국 '어떤 자료구조(그릇)에 다음 방문할 곳을 담을 것인가'입니다.
collections.deque를 사용하여 양방향 입출력을 로 최적화해야 합니다. 리스트의 pop(0)은 이 걸리므로 절대 사용해선 안 됩니다.from collections import deque
def bfs_template(start, graph, visited):
# 1. 큐 초기화 및 시작점 방문 처리
queue = deque([start])
visited[start] = True
# 2. 큐가 빌 때까지 반복
while queue:
# 가장 먼저 들어온(가까운) 노드 꺼내기
current = queue.popleft()
print(f"현재 방문한 노드: {current}") # 핵심 로직 수행 위치
# 3. 인접 노드 탐색
for next_node in graph[current]:
if not visited[next_node]:
queue.append(next_node)
visited[next_node] = True # [핵심] 큐에 넣을 때 반드시 방문 처리!
def dfs_template(current, graph, visited):
# 1. 현재 노드 방문 처리
visited[current] = True
print(f"현재 방문한 노드: {current}") # 핵심 로직 수행 위치
# 2. 인접 노드 탐색
for next_node in graph[current]:
# 아직 방문하지 않은 노드가 있다면, 즉시 그곳으로 깊게 파고들기(재귀 호출)
if not visited[next_node]:
dfs_template(next_node, graph, visited)
print 부분만 count += 1로 바꾸면 연결 요소의 개수를 구하는 문제가 되고, distance[next] = distance[current] + 1로 바꾸면 최단 거리 내비게이션으로 변신합니다.