๐ DFS (Depth-First Search)
๊น์ด ์ฐ์ ํ์, ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ํ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
๋ ธ๋(node)์ ๊ฐ์ (edge)๋ก ํํ
๊ทธ๋ํ ํ์
ํ๋์ ๋ ธ๋๋ฅผ ์์์ผ๋ก ๋ค์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒ
๋ ๋ ธ๋๊ฐ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด โก ๋ ๋ ธ๋๋ ์ธ์ ํ๋ค
๊ทธ๋ํ๋ฅผ ํํํ๋ 2๊ฐ์ง ๋ฐฉ์
์ธ์ ํ๋ ฌ (Adjacency Matrix) : 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ ์ฐ๊ฒฐ ๊ด๊ณ ํํ
์ธ์ ๋ฆฌ์คํธ (Adjacency List) : ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ ์ฐ๊ฒฐ ๊ด๊ณ ํํ
์ธ์ ํ๋ ฌ ๋ฐฉ์
2์ฐจ์ ๋ฆฌ์คํธ๋ก ๊ตฌํ
์ฐ๊ฒฐ๋์ด ์์ง ์๋ ๋ ธ๋๋ผ๋ฆฌ๋ ๋ฌดํ์ ๋น์ฉ (999999999 ๋ฑ์ ํฐ ๊ฐ์ผ๋ก ์ด๊ธฐํ)
INF = 99999999
graph = [ [0, 7, 5],
[7, 0, INF],
[5, INF, 0] ]
print(graph) # [[0, 7, 5], [7, 0, 99999999], [5, 99999999, 0]]
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์
๋ชจ๋ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ฐจ๋ก๋๋ก ์ฐ๊ฒฐํ์ฌ ์ ์ฅ
C++์ด๋ Java์ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ๋ณ๋๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ธฐ๋ฅ์ ์ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.
Python์ ๋ฆฌ์คํธ ์๋ฃํ์ด append()์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ฏ๋ก ๋จ์ํ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
graph = [[] for _ in range(3)]
# ๋
ธ๋ 0์ ์ฐ๊ฒฐ๋ ๋
ธ๋ : (๋
ธ๋, ๊ฐ์ )
graph[0].append((1, 7))
graph[0].append((2, 5))
graph[1].append((0, 7))
graph[2].append((0, 5))
print(graph) # [[(1, 7), (2, 5)], [(0, 7)], [(0, 5)]]
๋ ๋ฐฉ์์ ์ฐจ์ด
๋ฉ๋ชจ๋ฆฌ | ์๋ | |
์ธ์ ํ๋ ฌ ๋ฐฉ์ | ๋ชจ๋ ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ฏ๋ก ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ |
๋น ๋ฅด๋ค |
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์ | ์ฐ๊ฒฐ๋ ์ ๋ณด๋ง๋ค ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ |
์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํด์ผ ํ๋ค. ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ป๋ ์๋๊ฐ ๋๋ฆฌ๋ค. |
์๋ฅผ ๋ค์ด, ๋ ธ๋ 1๊ณผ ๋ ธ๋ 7์ด ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ ๋
์ธ์ ํ๋ ฌ ๋ฐฉ์์์๋ graph[1][7]๋ง ํ์ธํ๋ฉด ๋๋ค.
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์์๋ ๋ ธ๋ 1์ ๋ํ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์์์ ๋ถํฐ ์ฐจ๋ก๋๋ก ํ์ธํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ํน์ ํ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ธ์ ๋ ธ๋๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ, ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๋ญ๋น๊ฐ ์ ๋ค.
DFS ์๊ณ ๋ฆฌ์ฆ์ ํน์ ๊ฒฝ๋ก๋ก ํ์ํ๋ค๊ฐ ํน์ ์ํฉ์์ ์ต๋ํ ๊น์์ด ๋ค์ด๊ฐ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ, ๋ค์ ๋์๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ํ์ํ๋ค.
DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ค.
1๏ธโฃ ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ.
2๏ธโฃ ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ ์ธ์ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ.
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
3๏ธโฃ 2๏ธโฃ๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณต.
โป ์ธ์ ๋ ธ๋๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ๊ดํ์ ์ผ๋ก ๋ฒํธ๊ฐ ๋ฎ์ ์์๋ถํฐ ์ฒ๋ฆฌ
๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ํ๋ฅผ DFS ํ์์ ํ๋ ค๊ณ ํ๋ค.
์์ ๋ ธ๋ 1์ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
1 |
์คํ์ ์ต์๋จ ๋
ธ๋ 1
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ 2, 3, 8 => ๊ฐ์ฅ ์์ ๋ ธ๋ 2๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
2 |
1 |
์คํ์ ์ต์๋จ ๋
ธ๋ 2
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ 7 => ๋ ธ๋ 7์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
7 |
2 |
1 |
์คํ์ ์ต์๋จ ๋ ธ๋ 7
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ 6, 8 => ๊ฐ์ฅ ์์ ๋ ธ๋ 6์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
6 |
7 |
2 |
1 |
์คํ์ ์ต์๋จ ๋
ธ๋ 6
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค => ์คํ์์ 6๋ฒ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
7 |
2 |
1 |
์คํ์ ์ต์๋จ ๋
ธ๋ 7
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ 8 => ๋ ธ๋ 8์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
8 |
7 |
2 |
1 |
์คํ์ ์ต์๋จ ๋ ธ๋ 8
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค => ์คํ์์ 8๋ฒ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
7 |
2 |
1 |
์คํ์ ์ต์๋จ ๋ ธ๋ 7
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค => ์คํ์์ 7๋ฒ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
2 |
1 |
์คํ์ ์ต์๋จ ๋ ธ๋ 2
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค => ์คํ์์ 2๋ฒ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
1 |
์คํ์ ์ต์๋จ ๋ ธ๋ 1
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ 3 => ๋ ธ๋ 3์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
3 |
1 |
์คํ์ ์ต์๋จ ๋ ธ๋ 3
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ 4, 5 => ๊ฐ์ฅ ์์ ๋ ธ๋ 4๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
4 |
3 |
1 |
์คํ์ ์ต์๋จ ๋ ธ๋ 4
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋ 5 => ๋ ธ๋ 5๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
5 |
4 |
3 |
1 |
๋จ์ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค.
๋ ธ๋์ ํ์ ์์ (์คํ์ ๋ค์ด๊ฐ ์์)
1 - 2 - 7 - 6 - 8 - 3 - 4 - 5
DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ด ํ๋ค๋ ์ ์์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค.
์ค์ ๋ก๋ ์คํ์ ์ฌ์ฉํ์ง ์์๋ ๋๋ฉฐ ํ์ ์ํ ์๊ฐ์ O(N)์ด ์์๋๋ค.
์ค์ ๊ตฌํ์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ์ ๋ ๋งค์ฐ ๊ฐ๊ฒฐํ๊ฒ ๊ตฌํํ ์ ์๋ค.
ํ์ด์ฌ ์ฝ๋
def dfs(graph, v, visited):
visited[v] = True # ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋ฆฌ์คํธ
print(v, end=' ')
for i in graph[v]: # ๋
ธ๋ v์ ์ธ์ ํ ๋
ธ๋๋ค
if not visited[i]: # ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด
dfs(graph, i, visited)
graph = [[],
[2, 3, 8], # ๋
ธ๋ 1์ ์ธ์ ํ ๋
ธ๋
[1, 7], # ๋
ธ๋ 2์ ์ธ์ ํ ๋
ธ๋
[1, 4, 5], # ๋
ธ๋ 3์ ์ธ์ ํ ๋
ธ๋
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7] ]
visited = [False] * 9
dfs(graph, 1, visited) # ์์๋
ธ๋ 1
'Algorithm > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ํ๋ก๊ทธ๋๋จธ์ค - ํํ (0) | 2024.03.14 |
---|---|
[Python] ์ฌ๊ทํจ์ (0) | 2024.03.12 |
[Python] ์๋ฃ๊ตฌ์กฐ - ์คํ, ํ (0) | 2024.03.12 |
[Python] BFS ์๊ณ ๋ฆฌ์ฆ (0) | 2023.12.20 |
[Python] ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ (1) | 2023.11.20 |