7.1 DFS ์๊ณ ๋ฆฌ์ฆ์ ์๋ ์๋ฆฌ
๊น์ด ์ฐ์ ํ์ (Depth-First Search, DFS)๋ ๊ทธ๋ํ๋ฅผ ์ํํ๊ฑฐ๋ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด์ผ. ์์ ์ ์ ์์ ์์ํด์ ๋ฐฉ๋ฌธํ์ง ์์ ์ด์์ด ์์ ๋๊น์ง ๊ทธ๋ํ๋ฅผ ๋ ๊น์ด ํ์ํ ๋ค์, ๋์๊ฐ์ ๋ค๋ฅธ ์ ์ ์ผ๋ก ๊ณ์ ์งํํด.
์๊ณ ๋ฆฌ์ฆ ๋จ๊ณ:
- ์ ํํ ์์ ์ ์ ์์ ์์ํ๊ณ , ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ํ์ํด.
- ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฌธํ์ง ์์ ์ด์ ์ ์ ์ ํ์ํด.
- ์ด ์ด์ ์ ์ ์ ๋ํด ๋จ๊ณ 1๊ณผ 2๋ฅผ ๋ฐ๋ณตํด.
- ํ์ฌ ์ ์ ์ ์ด์์ด ๋ชจ๋ ๋ฐฉ๋ฌธ๋๋ฉด ์ด์ ์ ์ ์ผ๋ก ๋์๊ฐ (backtrack) ๊ณผ์ ์ ๊ณ์ํด.
- ์์ ์ ์ ์์ ๋๋ฌํ ์ ์๋ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋๊น์ง ๊ณผ์ ์ ๋ฐ๋ณตํด.
์๊ฐํ:
DFS์ ์๊ฐ ๋ฐ ๊ณต๊ฐ ๋ณต์ก๋:
์๊ฐ ๋ณต์ก๋:
O(V + E)
, ์ฌ๊ธฐ์ V
๋ ์ ์ ์ ์, E
๋ ๊ฐ์ ์ ์์ผ.
๊ทธ๋ํ์ ๊ฐ ๋ ธ๋์ ๊ฐ ๊ฐ์ ์ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธ๋ผ.
๊ณต๊ฐ ๋ณต์ก๋:
O(V)
, ํธ์ถ ์คํ์ด๋ ๋ช
์์ ์คํ์ ์ฌ์ฉํ์ฌ ์ ์ ์ ์ ์ฅํ๊ณ , ์ํ (๋ฐฉ๋ฌธํ ์ ์ )๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด์ผ.
7.2 ์ฌ๊ท๋ฅผ ์ฌ์ฉํ DFS ๊ตฌํ
๋จผ์ ์ฌ๊ท๋ฅผ ์ฌ์ฉํด์ DFS๋ฅผ ๊ตฌํํด๋ณด์ โ ์ฝ๋๊ฐ ์๋ฆ๋ต๊ณ ๊ฐ๊ฒฐํ ๊ฑฐ์ผ.
์ฌ๊ท์ DFS ๊ตฌํ:
def dfs_recursive(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(start) # ๋
ธ๋ ์ฒ๋ฆฌ
for neighbor in graph[start]:
if neighbor not in visited:
dfs_recursive(graph, neighbor, visited)
# ์ฌ์ฉ ์์:
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B'],
'F': ['C']
}
dfs_recursive(graph, 'A')
7.3 ์คํ์ ์ฌ์ฉํ DFS ๊ตฌํ
์ฌ๊ท ์์ด ๊ตฌํํ๋ฉด ์ฝ๋๊ฐ ์กฐ๊ธ ๋ ๊ธธ์ด์ ธ, ์๋ํ๋ฉด ๋ฐฉ๋ฌธํ ์ ์ ์ ๋ชฉ๋ก์ ์ถ๊ฐ๋ก ์ ์ฅํด์ผ ํ๊ฑฐ๋ .
์คํ์ ์ฌ์ฉํ ๋ฐ๋ณต์ DFS ๊ตฌํ:
def dfs_iterative(graph, start):
visited = set()
stack = [start]
while stack:
vertex = stack.pop()
if vertex not in visited:
visited.add(vertex)
print(vertex) # ๋
ธ๋ ์ฒ๋ฆฌ
for neighbor in reversed(graph[vertex]): # ์ฌ๋ฐ๋ฅธ ์ํ ์์๋ฅผ ์ํด ๋ฐ๋๋ก ์ํ
if neighbor not in visited:
stack.append(neighbor)
# ์ฌ์ฉ ์์:
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B'],
'F': ['C']
}
dfs_iterative(graph, 'A')
7.4 DFS๋ฅผ ์ฌ์ฉํด ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์ ์
DFS๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋ ๊ณ ์ ์ ์ธ ๋ฌธ์ ์ ์:
1. ๋ฏธ๋ก์์์ ๊ฒฝ๋ก ์ฐพ๊ธฐ:
์์ ์ง์ ์์ ๋ ์ง์ ๊น์ง ๋ฏธ๋ก์์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉ๋ผ.
์ ์ฉ ๋ถ์ผ:
๋น๋์ค ๊ฒ์๊ณผ ๋ก๋ด๊ณตํ์์ ๋ฏธ๋ก์ ๋ณต์กํ ๊ณต๊ฐ์ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋ผ.
2. ๊ทธ๋ํ ์ฐ๊ฒฐ์ฑ ๊ฒ์ฌ:
๊ทธ๋ํ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง (๋ชจ๋ ๋ ์ ์ ์ฌ์ด์ ๊ฒฝ๋ก๊ฐ ์๋์ง) ํ์ธํ๋ ๊ฒ.
์ ์ฉ ๋ถ์ผ:
๋คํธ์ํฌ ๋ถ์์์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ฑ์ ๊ฒ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋ผ.
3. ์์ ์ ๋ ฌ:
๋ฐฉํฅ์ฑ ๋น์ํ ๊ทธ๋ํ (DAG)์ ์ ์ ์ ์ ๋ ฌํ๋ ๋ฐ ์ฌ์ฉ๋ผ. ๋ชจ๋ ๊ฐ์ (u, v)์ ๋ํด ์ ์ u๊ฐ ์ ์ v์ ์์๋๋ก.
์ ์ฉ ๋ถ์ผ:
์ปดํ์ผ๋ฌ์์ ์์กด์ฑ๊ณผ ์์ ์ ์ ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ผ.
4. ๊ทธ๋ํ์์ ์ฌ์ดํด ๋ฐ๊ฒฌ:
๊ทธ๋ํ์ ์ฌ์ดํด์ด ์๋์ง ๊ฒ์ฌํ๋ ๊ฒ.
์ ์ฉ ๋ถ์ผ:
์์กด์ฑ ๋ถ์์์ ์ํ ์์กด์ฑ์ ๋ฐ๊ฒฌํ๋ ๋ฐ ์ฌ์ฉ๋ผ.
5. ๋ฏธ๋ก ์์ฑ:
๋๋ค ๋ฏธ๋ก๋ฅผ ์์ฑํ๋ ๋ฐ DFS ์ฌ์ฉ.
์ ์ฉ ๋ถ์ผ:
๊ฒ์ ๋ฐ ์ํฐํ ์ธ๋จผํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฏธ๋ก๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ผ.
GO TO FULL VERSION