๋ฐ์ํ

-- ๋ณธ ํฌ์คํ ์ ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ ์ฑ ์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋์์ต๋๋ค.
1. DFS
- Depth First Search, ๊น์ด ์ฐ์ ํ์
- ๊ทธ๋ํ์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ฃผ๋ก ์คํ์ ํ์ฉํ๋ ๋ฐฉ์์
- ์คํ : ํ์ ํ์ถ)
- ๋์๋ฐฉ์
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ์คํ์ ์ต ์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค๋ฉด ๊ทธ ์ธ์ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- 2๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- ๋์๋ฐฉ์์ ์๋ ๊ทธ๋ํ๋ฅผ ์์๋ก ์ดํด๋ณด์.





- ๋ง์ง๋ง์ "์คํ์ด ๋ค์ด๊ฐ ์์" ๋ฅผ ํ๋ฐ ๋ชจ์๋ณด๋ฉด, 1,2,7,6,8,3,4,5 ๊ฐ ๋๋ค.
โถ DFS๋ฅผ ์ฝ๋๋ก ๊ตฌํํด๋ณด๊ธฐ
- ์์ ๋์ผํ ๊ทธ๋ํ๋ฅผ ๊ฐ์ง๊ณ DFS๋ฅผ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ก ๊ตฌํํด๋ณด์.
- ์ค๊ธ๋ก ํํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ๋ค.
- ๋๋ถ๋ถ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ๋ค. (๋์์๋ฆฌ๋ ์คํ์ด๋ค)
#DFS ๋ฉ์๋ ์ ์
def DFS(graph, v, visited):
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[v] = True
# ์คํ์ ๋ค์ด๊ฐ ๋
ธ๋๋ค์ด ์์๋๋ก ์ถ๋ ฅ๋๋ค.
print(v, end='')
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ
for i in graph[v]:
if not visited[i]:
DFS(graph, i, visited)
# ๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ (2์ฐจ์ ๋ฆฌ์คํธ)
graph = [
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ (1์ฐจ์ ๋ฆฌ์คํธ)
# ์ผ๋จ 9๊ฐ๋ฅผ Fasle๋ก ํํํ๊ณ , ๋ฐฉ๋ฌธํ ๋๋ง๋ค True๋ก ๋ฐ๊พธ์ด ์ค ๊ฒ์.
# ๋
ธ๋ ๋ฒํธ์ ํต์ผ์ํค๊ธฐ ์ํด graph ์๋ grpah[0]์ ๋น ๋ฆฌ์คํธ๋ฅผ ๋ฃ์ด์ฃผ์๊ณ , ์ฌ๊ธฐ์๋ 9๊ฐ๋ก.
visited = [False] * 9
# ์ ์๋ DFSํจ์ ํธ์ถ
DFS(graph, 1, visited)
## ์ถ๋ ฅ๊ฐ ---> 1 2 7 6 8 3 4 5
2. BFS
- Breadth First Search, ๋๋น ์ฐ์ ํ์
- ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ฃผ๋ก ํ๋ฅผ ํ์ฉํ์ฌ ๊ตฌํ๋จ.
- ํ : ์ ์ ์ ์ถ ๋ฐฉ์์ ์๋ฃ๊ตฌ์กฐ
- ๋์๋ฐฉ์
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- 2๋ฒ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ์งํํ๋ค.
- ๋์๋ฐฉ์์ ์๋ ๊ทธ๋ํ๋ฅผ ์์๋ก ์ดํดํด๋ณด์.


- ํ์ ๋ค์ด๊ฐ ์์๋ 1, 2, 3, 8, 7, 4, 5, 6 ์ด ๋๋ค.
โถ BFS๋ฅผ ์ฝ๋๋ก ๊ตฌํํด๋ณด๊ธฐ
- ์์์ ๋ค๋ฃฌ ๋์ผํ ๊ทธ๋ํ๋ฅผ ๊ฐ์ง๊ณ BFS์ฝ๋๋ฅผ ๊ตฌํํด ๋ณผ๊ฒ์ด๋ค.
- deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค.
- deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด O(N)์ ์๊ฐ์ด ์์๋๋ค.
- ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ๋ DFS ๋ณด๋ค ์ํ ์๊ฐ์ด ๋ ํจ์จ์ ์ด๋ค.
from collections import deque
# BFS ๋ฉ์๋ ์ ์
def BSF(graph, start, visited):
# ํ ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉ ํ ๊ฒ์ด๋ค.
queue = deque([start])
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
visited[start] = True
# ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while queue:
# ํ์ ๋ค์ด๊ฐ ์์๋ค์ด ์์๋๋ก ์ถ๋ ฅ๋๋ค.
print(v, end=' ')
# ํด๋น ์์์ ์ฐ๊ฒฐ๋, ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์์๋ค์ ํ์ ์ฝ์
ํ์.
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# ๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ฐฉ์์ผ๋ก ํํ
graph = [
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ 1์ฐจ์ ๋ฆฌ์คํธ๋ก ํํ
visited = [False] * 9
# BFS ํธ์ถ
BFS(graph, 1, visited)
## ์ถ๋ ฅ๋ ๊ฒฐ๊ณผ ---> 1 2 3 8 7 4 5 6
๋ฐ์ํ