Ch.7 그래프
그래프 표현 — 인접 리스트 vs 인접 행렬
친구 목록 vs 관계 표 — 어떤 게 효율적일까?
5명의 친구 관계를 저장한다고 합시다. 각 사람마다 친구 목록을 만들 수도 있고, 5×5 표에 관계를 체크할 수도 있습니다. 어떤 방식이 더 나을까요?
노드가 1만 개인데 엣지가 100개뿐이라면? 1만×1만 행렬은 낭비 아닐까?
희소 그래프는 인접 리스트, 밀집 그래프는 인접 행렬이 유리합니다. 면접에서 이 판단이 중요합니다.
핵심 개념
인접 리스트(Adjacency List)
각 노드별로 연결된 이웃 목록을 저장
defaultdict
키가 없으면 자동으로 빈 리스트를 생성하는 딕셔너리
핵심 내용
면접에서 가장 많이 쓰는 그래프 표현법을 배웁니다
from collections import defaultdict
# 인접 리스트 구축 — 무방향 그래프
def build_graph(edges):
graph = defaultdict(list)
for u, v in edges:
graph[u].append(v)
graph[v].append(u) # 무방향이므로 양쪽 추가
return graph
edges = [('A','B'), ('A','C'), ('B','D'), ('C','D')]
g = build_graph(edges)
print(dict(g))
# {'A': ['B','C'], 'B': ['A','D'], 'C': ['A','D'], 'D': ['B','C']}defaultdict(list)는 그래프 면접의 필수 패턴입니다. `graph[node].append(neighbor)` 한 줄이면 끝!
방향 그래프라면? `graph[v].append(u)` 줄만 빼면 됩니다
인접 행렬은 V×V 크기의 2차원 배열입니다
# 인접 행렬 구축
def build_matrix(n, edges):
matrix = [[0] * n for _ in range(n)]
for u, v in edges:
matrix[u][v] = 1
matrix[v][u] = 1 # 무방향
return matrix
# 노드 0,1,2,3 / 엣지 (0,1),(0,2),(1,3),(2,3)
m = build_matrix(4, [(0,1),(0,2),(1,3),(2,3)])
for row in m:
print(row)
# [0, 1, 1, 0]
# [1, 0, 0, 1]
# [1, 0, 0, 1]
# [0, 1, 1, 0]`matrix[u][v] == 1`이면 u→v 엣지 존재. O(1)로 연결 여부를 확인할 수 있습니다
두 방식의 장단점을 비교해봅시다
인접 리스트 • 공간: O(V + E) — 희소 그래프에 유리 • 이웃 순회: O(degree) — 빠름 • 연결 확인: O(degree) — 느릴 수 있음 인접 행렬 • 공간: O(V²) — 밀집 그래프에 유리 • 이웃 순회: O(V) — 느림 • 연결 확인: O(1) — 매우 빠름
면접의 90%는 인접 리스트를 씁니다. 대부분의 면접 그래프는 희소(sparse)하기 때문입니다
엣지 리스트에서 인접 리스트를 만드는 과정을 추적합니다
무방향 그래프에서는 엣지 하나당 두 번 append합니다. 이걸 잊으면 반만 연결돼서 탐색이 깨집니다
노드 10,000개, 엣지 50개인 그래프에 적합한 표현 방식은?
인접 행렬에서 두 노드의 연결 여부를 확인하는 시간 복잡도는 O(V)이다
그래프 표현 마스터!
핵심 용어
인접 리스트
각 노드마다 이웃 목록을 저장하는 방식
인접 행렬
V×V 2차원 배열로 연결 여부를 표시
defaultdict(list)
없는 키에 자동으로 빈 리스트 생성
정리 노트
인접 리스트 vs 인접 행렬
핵심 비교
- 인접 리스트
- O(V+E) 공간, 희소 그래프에 적합
- 인접 행렬
- O(V²) 공간, 밀집 그래프에 적합
- 면접 기본
- defaultdict(list) + for u,v in edges
실전 팁
- 무방향 그래프
- 양쪽 모두 append — 빼먹으면 탐색 실패
- 면접 선택
- 대부분 인접 리스트 (희소 그래프가 주류)
그래프 문제 시작 시 'from collections import defaultdict'부터 쓰기!
시각 자료
핵심 정리
- 1인접 리스트: defaultdict(list)로 O(V+E) 공간
- 2인접 행렬: V×V 배열로 O(1) 연결 확인
- 3면접 90%는 인접 리스트 — 희소 그래프가 대부분
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작