14강 / 20강
그래프 — 점과 선으로 그린 관계
친구 관계, 지하철 노선도, 인터넷 그 자체
트리에는 규칙이 있었습니다 — 부모는 하나, 순환은 없음. 이 규칙을 전부 없애면 어떻게 될까요? 아무 점이나 아무 점과 이어질 수 있는 구조, 그게 그래프(graph)입니다.
- SNS 친구 관계 — 나와 친구, 친구의 친구
- 지하철 노선도 — 역과 역 사이의 연결
- 내비게이션 — 교차로와 도로
- 인터넷 — 웹페이지와 링크
| 용어 | 뜻 |
|---|---|
| 정점 (vertex, node) | 점 하나 — 사람, 역, 도시 |
| 간선 (edge) | 점을 잇는 선 — 친구 관계, 노선 |
| 방향 그래프 | 화살표가 있음 — 인스타 팔로우(내가 팔로우해도 상대는 아닐 수 있음) |
| 무방향 그래프 | 화살표 없음 — 페이스북 친구(양쪽 다 친구) |
| 가중치 | 선에 붙은 숫자 — 거리, 시간, 요금 |
그래프를 코드로 담는 두 가지 방법
📇 인접 리스트
딕셔너리 + 리스트각 점이 이웃 목록을 들고 있음
선이 적을 때 메모리 절약 ✅
대부분의 실제 그래프가 이 경우
🔢 인접 행렬
2차원 리스트[ㄱ][ㄴ] 이 1이면 연결됨"둘이 이어졌나?"를 즉시 확인 ✅
점이 많으면 메모리 폭발 ❌
그래프는 특별한 문법이 아니라 딕셔너리 + 리스트입니다.
Python
브라우저에서 실행
🎮 그래프 실험실
점을 클릭해 선을 이어 보세요. 인접 리스트와 인접 행렬이 동시에 갱신되는 걸 볼 수 있습니다. 점이 늘어날 때 행렬 칸이 얼마나 빠르게 불어나는지도 확인해 보세요.
같은 그래프, 두 가지 모습. 행렬은 점 개수의 제곱만큼 자랍니다.
Python
브라우저에서 실행
지하철 노선도를 그래프로. 마지막 부분이 15강 BFS입니다.
Python
브라우저에서 실행
🤔 확인 문제
트리와 그래프의 관계로 옳은 것은?
해설 그래프가 더 넓은 개념입니다. 거기에 순환 없음 + 모두 연결이라는 조건을 붙이면 트리가 돼요.
🤔 확인 문제
정점이 1000개인데 간선은 2000개뿐인 그래프. 알맞은 표현은?
해설 행렬은 1000×1000 = 100만 칸이 필요한데 그중 4000칸만 씁니다. 이렇게 선이 드문(희소) 그래프에는 인접 리스트가 압도적으로 유리해요.
🤔 확인 문제
인스타그램 팔로우 관계를 그래프로 표현한다면?
해설 "A → B" 와 "B → A" 가 다른 의미이므로 방향 그래프입니다. 페이스북 친구처럼 항상 양방향인 관계라면 무방향 그래프예요.