๊ทธ๋ํ์ ๊ฐ๋
๊ทธ๋ํ(Graph)๋ ๋ ธ๋(Node, ์ ์ Vertex)์ ๊ทธ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ (Edge)์ ํ๋๋ก ๋ชจ์ ๋์ ๋น์ ํ ์๋ฃ๊ตฌ์กฐ๋ค. ๋์์ ๋์ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก๋, ์ปดํจํฐ ๋คํธ์ํฌ ๋๋ ์ฌ๋์ ์ธ๋งฅ ๊ด๊ณ ์ฒ๋ผ ์ด๋ ํ ๊ด๊ณ๋ฅผ ํํํ ๋ ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ํ์ ์ข ๋ฅ
1. ๋ฐฉํฅ ๊ทธ๋ํ(Directed Graph) vs ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ(Undirected Graph)
๋ฐฉํฅ ๊ทธ๋ํ๋ ๊ฐ์ ์ ๋ฐฉํฅ์ฑ์ด ์กด์ฌํด์ ๊ฐ ๊ฐ์ ๋ง๋ค ํน์ ํ ๋ฐฉํฅ์ผ๋ก๋ง ์ด๋์ด ๊ฐ๋ฅํ ๊ทธ๋ํ๋ค. ๋ฐ๋ฉด, ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ๋ ๊ฐ์ ์ ๋ฐฉํฅ์ด ์์ด ์๋ฐฉํฅ์ผ๋ก ์ด๋์ด ๊ฐ๋ฅํ ๊ทธ๋ํ๋ค.
2. ๊ฐ์ค์น ๊ทธ๋ํ(Weighted Graph)
๊ฐ์ค์น ๊ทธ๋ํ๋ ๊ฐ์ ์ ๋น์ฉ(๊ฐ์ค์น)์ด ๋ถ์ฌ๋ ๊ทธ๋ํ๋ค.
3. ์ฐ๊ฒฐ ๊ทธ๋ํ(Connected Graph) vs ๋น์ฐ๊ฒฐ ๊ทธ๋ํ(Disconnected Graph)
์ฐ๊ฒฐ ๊ทธ๋ํ๋ ๋ชจ๋ ์ ์ ์ด ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ทธ๋ํ๋ค. ๋ฐ๋ฉด, ๋น์ฐ๊ฒฐ ๊ทธ๋ํ๋ ์ผ๋ถ ์ ์ ๊ฐ์ ์ฐ๊ฒฐ์ด ์๋ ๊ทธ๋ํ๋ค.
4. ์ฌ์ดํด ๊ทธ๋ํ(Cyclic Graph) vs ๋น์ฌ์ดํด ๊ทธ๋ํ(Acyclic Graph)
์ฌ์ดํด ๊ทธ๋ํ๋ ๋ซํ ๊ฒฝ๋ก(์ฌ์ดํด)๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ ๊ฒ์ ์ด๋ ํ ํ ์ ์ ์์ ์ถ๋ฐํด์ ๋ค์ ์ถ๋ฐ ๋ ธ๋๋ก ๋์์ฌ ์ ์์์ ๋งํ๋ค. ์ด๋, ์๊ธฐ ์์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ธ self-loop๋ ์ฌ์ดํด๋ก ๊ฐ์ฃผ๋๋ค. ๋ฐ๋ฉด, ๋น์ฌ์ดํด ๊ทธ๋ํ๋ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
DAG(Directed Acyclic Graph)
DAG๋ ๋ฐฉํฅ์ฑ๊ณผ ๋น์ฌ์ดํด์ฑ์ ๊ฐ์ง ๊ทธ๋ํ์ด๋ค. ์์ ์ ์ฐ์ ์์๋ ์์กด์ฑ์ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉํ๋ฉฐ, ์์ ์ ๋ ฌ(Topological Sort, ๋ชจ๋ ๊ฐ์ ์ ๋ฐฉํฅ์ฑ์ ๊ฑฐ์ค๋ฅด์ง ์๋๋ก ์ ์ ์ ๋์ดํ๋ ๋ฐฉ๋ฒ)์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ํ์ ์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ์ ์ ๊ณผ ๊ฐ์ ์ ํตํด ๋ณต์กํ ๊ด๊ณ๋ฅผ ์ฝ๊ฒ ๋ชจ๋ธ๋ง ํ ์ ์๋ค.
- ์์ ๋คํธ์ํฌ, ์ง๋ ํ์, ์์ ์ค์ผ์ค๋ง ๋ฑ ํ์ค ๋ฌธ์ ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๋ฐ์ ์ ํฉํ๋ค.
- ์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํ์ฉํ ๊ตฌํ์ผ๋ก ์ ์ฐํ ํํ ๋ฐฉ์์ ๊ฐ๋๋ค.
๋จ์
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํฐ ํธ์ด๋ค. ํนํ ์ธ์ ํ๋ ฌ์ ๋ฐ๋๊ฐ ๋ฎ์ ๊ทธ๋ํ์์ ๋นํจ์จ์ ์ด๋ค.
- ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ด ๋ณต์กํ๊ณ ์ฑ๋ฅ ์ต์ ํ๊ฐ ํ์ํ๋ค.
๊ทธ๋ํ์ ์ฌ์ฉ ์ฌ๋ก
- ๋ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ์๊ฐ์ ์ผ๋ก ํํํด์ผ ํ ๋
- ์์ ๋คํธ์ํฌ์์ ์น๊ตฌ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๊ฒฝ์ฐ
- ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉ์์ ์ํ ๊ฐ์ ์ฐ๊ด์ฑ์ ๋ชจ๋ธ๋งํ๋ ๊ฒฝ์ฐ
- ํน์ ์ง์ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ ๋
- ์ง๋์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ๋ค๋น๊ฒ์ด์ ์์คํ
- ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ ํจํท ์ ๋ฌ ๊ฒฝ๋ก ์ต์ ํ
- ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ(Dijkstra, A*) ์ ์ฉ
- ์์
๊ฐ์ ์ ํ ๊ด๊ณ๋ฅผ ์ ์ํ๊ณ ์ค์ผ์ค๋ง์ ์ต์ ํํ ๋
- ์ํํธ์จ์ด ์ปดํ์ผ ์ ํ์ผ ์์กด์ฑ์ ํํํ๋ ๋ฐ DAG ์ฌ์ฉ
- ์์ ์์๋ฅผ ๊ณ์ฐํ๋ ์์ ์ ๋ ฌ ์ฌ์ฉ
๊ทธ๋ํ ๊ตฌํ (Python)
์ ์ด๋ฏธ์ง์ ๋ฐฉํฅ์ฑ๊ณผ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ์ ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํด์ ๊ตฌํํด๋ณด์!
์ธ์ ๋ฆฌ์คํธ ํ์ฉ
์ธ์ ๋ฆฌ์คํธ(Adjacency List)
์ธ์ ๋ฆฌ์คํธ๋ ๊ทธ๋ํ์ ํ ์ ์ ์ ์ฐ๊ฒฐ๋์ด ์๋(์ธ์ ํ) ์ ์ ๋ค์ ํ๋์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ํํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ค์ ์ฐ๊ฒฐ๋ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ง ์ ์ฅํ๋ฏ๋ก, ๋ชจ๋ ์์ ๊ฐ์์ ํฉ์ด ๊ฐ์ ์ ๊ฐ์์ ๋์ผํ๋ค. ์ฆ, ๊ฐ์ ์ ๊ฐ์์ ๋น๋กํ๋ ๋ฉ๋ชจ๋ฆฌ๋ง ์ฐจ์งํ์ฌ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
๊ฐ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํด์ผํ๋ ๊ฒฝ์ฐ, ์ธ์ ๋ฆฌ์คํธ๊ฐ ์๊ฐ ์ ํฐ ์ด์ ์ ๊ฐ์ง๋ค. ๊ทธ๋ฌ๋ ํน์ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ์ ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ๋, ํด๋น ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ค์ ๋ชจ๋ ์ํํ๋ฉฐ ๋ค๋ฅธ ๋ ธ๋๊ฐ ์กด์ฌํ๋์ง ํ์ธํด์ผ ํ๋ค.
V, E = 7, 10 # ์ ์ 7๊ฐ, ๊ฐ์ 10๊ฐ
# ๊ฐ ๊ฐ์ ์ ๋ํ ์ ๋ณด๊ฐ (์์ ๋
ธ๋, ๋ ๋
ธ๋, ๊ฐ์ค์น)๋ก ์ฃผ์ด์ง.
edges = [(2, 1, 5), (2, 3, 3), (2, 5, 2), (4, 1, 1), (4, 6, 4), (5, 2, 2), (5, 4, 3), (5, 6, 3), (5, 4, 7)]
# ๊ฐ ์ ์ ์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ธ์ ๋ฆฌ์คํธ ์์ฑ
adj_list = [[] for _ in range(V+1)]
for start, end, weight in range(E):
# start์ end ๋
ธ๋๊ฐ start -> end๋ก์ ๋ฐฉํฅ์ฑ์ ๊ฐ์ง๊ณ ๊ฐ์ค์น๊ฐ weight์ธ ๊ฐ์ ์ ์ํด ์ฐ๊ฒฐ๋์ด์๋ค๋ ์ ๋ณด๊ฐ ์ ์ฅ๋จ
adj_list[start].append((end, weight))
์ธ์ ํ๋ ฌ ํ์ฉ
์ธ์ ํ๋ ฌ(Adjacency Matrix)
์ธ์ ํ๋ ฌ์ด๋ N x N Boolean ํ๋ ฌ๋ก์จ, ์ธ์ ํ๋ ฌ Matrix[i][j]๊ฐ True๋ผ๋ฉด, i๋ฒ์งธ ๋ ธ๋์์ j๋ฒ์งธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ์ ์ด ์์์ ๋ปํ๋ค.
๊ตฌํ์ด ๋น๊ต์ ์ฌ์ด ํธ์ด๋ฉฐ, ํน์ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ์ ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ๋ ์ธ๋ฑ์ฑ์ผ๋ก ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค๋ ์ฅ์ ์ด ์๋ค. ๋ฐ๋ฉด, ๊ฐ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํด์ผํ๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ์ผ์ผ์ด ํ์ธํด์ผํ๋ค. ์ฆ, ๋ ธ๋์ ์์ ๋นํด ๊ฐ์ ์ ๊ฐ์๊ฐ ํจ์ฌ ์ ์ ๊ทธ๋ํ๋ผ๋ฉด ๋นํจ์จ์ ์ด๋ค.
V, E = 7, 10 # ์ ์ 7๊ฐ, ๊ฐ์ 10๊ฐ
# ๊ฐ ๊ฐ์ ์ ๋ํ ์ ๋ณด๊ฐ (์์ ๋
ธ๋, ๋ ๋
ธ๋, ๊ฐ์ค์น)๋ก ์ฃผ์ด์ง.
edges = [(2, 1, 5), (2, 3, 3), (2, 5, 2), (4, 1, 1), (4, 6, 4), (5, 2, 2), (5, 4, 3), (5, 6, 3), (5, 4, 7)]
# ํน์ ์ ์ ์ด ๋ค๋ฅธ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ ์ง ์ฌ๋ถ๋ฅผ ์ ์ฅํ ์ธ์ ํ๋ ฌ ์์ฑ
adj_matrix = [[0]*V for _ in range(V+1)]
for start, end, weight in range(E):
# start์ end ๋
ธ๋๊ฐ start -> end๋ก์ ๋ฐฉํฅ์ฑ์ ๊ฐ์ง๊ณ ๊ฐ์ค์น๊ฐ weight์ธ ๊ฐ์ ์ ์ํด ์ฐ๊ฒฐ๋์ด์๋ค๋ ์ ๋ณด๊ฐ ์ ์ฅ๋จ
adj_matrix[start][end] = weight