Ch.7 그래프

그래프 표현 — 인접 리스트 vs 인접 행렬

defaultdict를 이용한 인접 리스트 구현을 작성한다인접 행렬의 구조와 장단점을 설명한다상황에 따라 적절한 표현 방식을 선택한다

친구 목록 vs 관계 표 — 어떤 게 효율적일까?

5명의 친구 관계를 저장한다고 합시다. 각 사람마다 친구 목록을 만들 수도 있고, 5×5 표에 관계를 체크할 수도 있습니다. 어떤 방식이 더 나을까요?

노드가 1만 개인데 엣지가 100개뿐이라면? 1만×1만 행렬은 낭비 아닐까?

희소 그래프는 인접 리스트, 밀집 그래프는 인접 행렬이 유리합니다. 면접에서 이 판단이 중요합니다.

lightbulb

핵심 개념

인접 리스트(Adjacency List)

각 노드별로 연결된 이웃 목록을 저장

defaultdict

키가 없으면 자동으로 빈 리스트를 생성하는 딕셔너리


article

핵심 내용

면접에서 가장 많이 쓰는 그래프 표현법을 배웁니다

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)이다

그래프 표현 마스터!

key

핵심 용어

📋

인접 리스트

각 노드마다 이웃 목록을 저장하는 방식

📊

인접 행렬

V×V 2차원 배열로 연결 여부를 표시

🐍

defaultdict(list)

없는 키에 자동으로 빈 리스트 생성

edit_note

정리 노트

인접 리스트 vs 인접 행렬

핵심 비교

인접 리스트
O(V+E) 공간, 희소 그래프에 적합
인접 행렬
O(V²) 공간, 밀집 그래프에 적합
면접 기본
defaultdict(list) + for u,v in edges

실전 팁

무방향 그래프
양쪽 모두 append — 빼먹으면 탐색 실패
면접 선택
대부분 인접 리스트 (희소 그래프가 주류)

그래프 문제 시작 시 'from collections import defaultdict'부터 쓰기!

image

시각 자료

다이어그램: ds-d59
다이어그램: ds-d53
check_circle

핵심 정리

  • 1인접 리스트: defaultdict(list)로 O(V+E) 공간
  • 2인접 행렬: V×V 배열로 O(1) 연결 확인
  • 3면접 90%는 인접 리스트 — 희소 그래프가 대부분

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작