그래프 이론 - 2. 그래프 표현 방법
2025. 2. 21. 16:48ㆍ소프트웨어/알고리즘
2. 그래프 표현 방법
2.1 인접 행렬(Adjacency Matrix)
📌 정의 및 구현
인접 행렬은 정점 간의 연결을 2차원 배열(행렬)로 표현하는 방법입니다.
📌 무방향 그래프 (비가중치)
A --- B
\ /
C
이 그래프를 인접 행렬로 나타내면 다음과 같습니다.
A | B | C | |
A | 0 | 1 | 1 |
B | 1 | 0 | 1 |
C | 1 | 1 | 0 |
📌 가중치 그래프 (Weighted Graph)
A --(2)--> B
\-(5)-→ C
이 경우, 가중치를 행렬에 저장합니다.
A | B | C | |
A | 0 | 2 | 5 |
B | 0 | 0 | 0 |
C | 0 | 0 | 0 |
📌 인접 행렬 구현 (Python)
# 그래프 정의 (가중 방향 그래프)
N = 3 # 정점 개수
adj_matrix = [[0] * N for _ in range(N)] # N x N 2차원 배열 초기화
# 간선 추가 (A=0, B=1, C=2)
adj_matrix[0][1] = 2 # A → B (가중치 2)
adj_matrix[0][2] = 5 # A → C (가중치 5)
# 행렬 출력
for row in adj_matrix:
print(row)
📌 출력 결과
[0, 2, 5]
[0, 0, 0]
[0, 0, 0]
2.2 인접 리스트(Adjacency List)
📌 정의 및 구현
각 정점마다 연결된 정점들을 리스트로 관리하는 방식입니다.
📌 무방향 그래프 (비가중치)
A --- B
\ /
C
A: [B, C]
B: [A, C]
C: [A, B]
📌 가중 방향 그래프 (Weighted Graph)
A --(3)--> B
\-(2)-→ C
A: [(B, 3), (C, 2)]
B: []
C: []
📌 인접 리스트 구현 (Python)
(1) 기본 딕셔너리(dict) 사용
# 기본 딕셔너리로 인접 리스트 구현
graph = {}
# 정점 추가
graph[0] = [1, 2] # A → B, A → C
graph[1] = [] # B는 아무것도 연결되지 않음
graph[2] = [] # C도 연결 없음
# 출력
for node, edges in graph.items():
print(f"{node}: {edges}")
📌 출력 결과
0: [1, 2]
1: []
2: []
(2) defaultdict 사용 (더 유연한 방식)
from collections import defaultdict
# defaultdict를 사용한 인접 리스트 구현
graph = defaultdict(list)
# 간선 추가 (A=0, B=1, C=2)
graph[0].append((1, 3)) # A → B (가중치 3)
graph[0].append((2, 2)) # A → C (가중치 2)
# 리스트 출력
for node, edges in graph.items():
print(f"{node}: {edges}")
📌 출력 결과
0: [(1, 3), (2, 2)]
1: []
2: []
✅ 최종 비교: 그래프 표현 방법 정리
표현 방식 | 저장 구조 | 메모리 사용 | 두 정점 간 연결 여부 확인 | 연결된 정점 탐색 속도 | 구현 난이도 | 추천 상황 |
인접 행렬 | 2차원 배열 | 𝑂(𝑁²) | 𝑂(1) (빠름) | 𝑂(𝑁) (느림) | 쉬움 | Dense Graph (간선이 많은 그래프) |
인접 리스트 | 리스트의 배열 | 𝑂(𝑁+E) | 𝑂(𝑁) (느림) | 𝑂(정점 차수) (빠름) | 보통 | Sparse Graph (간선이 적은 그래프) |
'소프트웨어 > 알고리즘' 카테고리의 다른 글
그래프 이론 - 4. 최소 비용 경로 알고리즘 (0) | 2025.02.21 |
---|---|
그래프 이론 - 3. 그래프 탐색 (Graph Traversal) (0) | 2025.02.21 |
그래프 이론 - 1. 그래프 이론 기초 (0) | 2025.02.21 |
힙 정렬 (Heap Sort) (C++) (0) | 2025.01.04 |
병합 정렬 (Merge Sort) (C++) (0) | 2025.01.04 |