출시·고도화 중
Algorithm
그래프 탐색은 BFS와 DFS로 연결된 정점을 빠짐없이 방문하는 방법으로, 최단 거리, 연결 요소, 사이클 탐지, 위상 정렬의 기초가 됩니다.
그래프 탐색은 정점과 간선으로 이루어진 그래프에서 시작 정점부터 도달할 수 있는 모든 정점을 한 번씩 방문하는 알고리즘입니다. 큐를 써서 가까운 정점부터 한 겹씩 넓혀 가는 너비 우선 탐색(BFS)과, 스택이나 재귀로 한 방향을 끝까지 따라갔다가 되돌아오는 깊이 우선 탐색(DFS)이 기본입니다. 그래프는 보통 인접 리스트나 인접 행렬로 저장하고, 미로 같은 2차원 격자도 칸을 정점으로 보면 같은 방법으로 다룰 수 있습니다.
도로망, 소셜 네트워크, 작업 의존 관계, 웹 링크처럼 관계로 표현되는 데이터는 모두 그래프입니다. BFS는 가중치가 없는 그래프에서 최단 경로를 구하고, DFS는 연결 요소 찾기, 사이클 탐지, 위상 정렬의 뼈대가 됩니다. 빌드 도구의 작업 순서, 가비지 컬렉터의 도달성 검사, 그림 편집기의 영역 채우기도 그래프 탐색으로 동작하며, 코딩 테스트에서도 가장 자주 나오는 유형 가운데 하나입니다.
먼저 작은 그래프를 종이에 그려 BFS의 큐와 DFS의 호출 스택이 어떻게 바뀌는지 손으로 따라가 보는 것이 좋습니다. 그다음 방문 표시를 언제 하는지, 거리와 부모를 어떻게 기록하는지에 주의하며 직접 구현하고, 격자 최단 거리, 연결 요소 세기, Kahn 알고리즘을 이용한 위상 정렬 문제로 넓혀 가면 됩니다.
인접 리스트는 O(V + E) 메모리로 희소 그래프에 알맞고, 인접 행렬은 간선 확인이 O(1)이지만 O(V^2) 메모리를 씁니다.
큐로 가까운 정점부터 방문하므로, 가중치가 없는 그래프에서 처음 도달한 거리가 곧 최단 거리입니다.
재귀나 스택으로 깊이 들어갔다 되돌아오며, 연결 요소와 사이클 탐지, 백트래킹의 기반이 됩니다.
사이클이 없는 방향 그래프에서 의존 관계를 지키는 순서를 Kahn 알고리즘이나 DFS 종료 순서로 구합니다.
정점 6개짜리 무방향 그래프를 사전 기반 인접 리스트로 만들고, deque를 쓴 BFS로 A에서 각 정점까지의 최단 간선 수를, 재귀 DFS로 방문 순서를 출력합니다. 두 함수 모두 방문 표시로 같은 정점을 다시 보지 않습니다.
graph_traversal.py
from collections import deque
graph = {
"A": ["B", "C"],
"B": ["A", "D"],
"C": ["A", "D", "E"],
"D": ["B", "C", "F"],
"E": ["C", "F"],
"F": ["D", "E"],
}
def bfs(start):
"""Shortest number of edges from start to every reachable vertex."""
dist = {start: 0}
queue = deque([start])
while queue:
node = queue.popleft()
for nxt in graph[node]:
if nxt not in dist:
dist[nxt] = dist[node] + 1
queue.append(nxt)
return dist
def dfs(start):
"""Vertices in depth-first visiting order."""
order, seen = [], set()
def visit(node):
seen.add(node)
order.append(node)
for nxt in graph[node]:
if nxt not in seen:
visit(nxt)
visit(start)
return order
print(bfs("A")) # {'A': 0, 'B': 1, 'C': 1, 'D': 2, 'E': 2, 'F': 3}
print(dfs("A")) # ['A', 'B', 'D', 'C', 'E', 'F']
python graph_traversal.py설치부터 그래프 탐색 의 핵심 개념까지, 여섯 장으로 차근차근 따라 합니다.
그래프 탐색 에 관해 묻고, 경험을 나누고, 의견을 주고받는 곳입니다.
아직 토론이 없습니다. 첫 이야기를 시작해 보세요.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.