2020. 8. 25. 16:57ใ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค/DFS,BFS
DFS(๊น์ด ์ฐ์ ํ์), BFS(๋๋น ์ฐ์ ํ์)
์ค๋ ๋ฐฐ์๋ณผ ๋ด์ฉ์ ํ์์ด๋ค.
ํ์์ด๋ ๋ง์ ์์ ๋ฐ์ดํฐ ์ค์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ ๋งํ๋ค.
์ด๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ, ํ๋ก๊ทธ๋๋ฐ์์ ์์ฃผ ์ฌ์ฉํ๋, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์์๋๋ ๊ตฌ์กฐ๋ ๋ฐ๋ก DFS, BFS ์ด๋ค.
์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ๋จผ์ ์๋ฃ๊ตฌ์กฐ์ ๋ํด์ ์์ ๋ณผ ํ์๊ฐ ์๋ค.
์๋ฃ๊ตฌ์กฐ๋ '๋ฐ์ดํฐ๋ฅผ ํํํ๊ณ ๊ด๋ฆฌํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ตฌ์กฐ'๋ฅผ ๋งํ๋ค.
๋ํ์ ์ผ๋ก ์๋ฃ๊ตฌ์กฐ์๋ ๋ฐฐ์ด, ์ฐ๊ฒฐ๋ฆฌ์คํธ, ์คํ, ํ, ํธ๋ฆฌ, ๊ทธ๋ํ๊ฐ ์๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ํ์ํ ์๋ฃ๊ตฌ์กฐ๋ ์คํ๊ณผ ํ์ด๋ค.
์คํ(Stack)
"๋จผ์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋์ค์ ๋์จ๋ค"๊ฐ ํต์ฌ์ด๋ค. ์ด๋ฅผ ์ฐ๋ฆฌ๋ FILO(First In Last Out)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํ์ด์ฌ์์ ์คํ์ ๊ธฐ๋ณธ ๋ฆฌ์คํธ์์ append()์ pop()์ ์ด์ฉํ๋ฉด ๋ค๋ฅธ ์ธ์ด์ ์คํ๊ณผ ๋์ผํ๊ฒ ๋์ํ๋ค.
ํ(Queue)
ํ๋ ์คํ๊ณผ ๋ฐ๋๋ก, "๋จผ์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ๋์จ๋ค"๊ฐ ํต์ฌ์ด๋ค. ์ด๋ฅผ FIFO(First In First Out)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํด๋ ๋์ง๋ง, ๋ณดํต Collections ๋ชจ๋์์ deque๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ค. ์๋ํ๋ฉด deque๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋บด๋ ์๋๊ฐ ๋น ๋ฅด๊ณ , ๋ ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋๊ฐ์ง ์๋ฃ๊ตฌ์กฐ๋ง ์๊ณ ์๋ค๋ฉด DFS์ BFS์ ๊ฐ๋ ์ ์ ์ดํดํ ์ ์๋ค.
DFS(๊น์ด ์ฐ์ ํ์)
DFS์ ์ ์๋ ๊น์๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํ๊ธฐ ์ํด์๋ ์์ ์๋ฃ๊ตฌ์กฐ์ธ ์คํ์ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ, ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํ๊ธฐ ์ํด ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ์คํ๊ณผ ์ฌ๊ทํจ์๋ ์๋นํ ๋น์ทํ๋ค๊ณ ๋ณผ์๊ฐ ์๋ค. ์ปดํจํฐ ๊ตฌ์กฐ์ธก๋ฉด์์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฐ์ ๊ณต๊ฐ์ ์ ์ฌ๋๊ธฐ ๋๋ฌธ์ด๋ค. ํ์๋ ์ฌ๊ทํจ์๋ก DFS๋ฅผ ๊ตฌํํ๋ ค๊ณ ํ๋ค.
DFS๋ '๊ทธ๋ํ'์์ ์ฌ์ฉ์ด ๋๋๋ฐ, ๊ทธ๋ํ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ ๋ ๊ฐ์ง๊ฐ ์๋ค.
์ธ์ ํ๋ ฌ์ 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํด ๊ตฌํํ๊ณ , ์ธ์ ๋ฆฌ์คํธ๋ ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ๊ด๊ณ๋ฅผ ๊ตฌํํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๊ฒฐ๊ตญ ์ฐ๊ฒฐ๋์ด ์๋ ๋ ธ๋(์ )๋ค์ ํ์ํ๊ธฐ ์ํด DFS์ BFS๋ฅผ ๋ฐฐ์ด๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ์ ๋ํด์ ์กฐ๊ธ ๋ ์ดํด๋ณด์๋ฉด, ์ธ์ ํ๋ ฌ์ ์ธ์ ๋ฆฌ์คํธ์ ๋นํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค. ์๋ํ๋ฉด ์ธ์ ๋ฆฌ์คํธ๋ ์ฐ๊ฒฐ๋์ด์๋ ๋ฐ์ดํฐ๋ง์ ์ ์ฅํ๊ณ , ์ธ์ ํ๋ ฌ์ ์ฐ๊ฒฐ๋์ด ์์ง ์์ ๊ฒ๋ค๋ INF(๋ฌดํ๋)์ ๊ฐ์ผ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ธ์ ๋ฆฌ์คํธ๋ ์ธ์ ํ๋ ฌ์ ๋นํด ํน์ ๋ฐ์ดํฐ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ์๊ธฐ์ ๊น๋ค๋กญ๋ค. ์ด์ ๋ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ํ๋ ํ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ๊ฐ๋ ๋ค์ ์ด์ฉํด ์ฐ์ต๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ฒ ๋ค.
์ด์ ๊ฐ์ ๋ ธ๋๊ฐ ์๋ค๊ณ ํ์. ์ฐ๋ฆฌ๋ 1๋ฒ๋ถํฐ ๊น์ด ์ฐ์ ํ์์ ํ๋ ค๊ณ ํ๋ค. ์์๋ฅผ ์ถ๋ ฅํ๋ผ๊ณ ๋ฌธ์ ์ ์ฃผ์ด์ก์ ๋ ์ฐ๋ฆฌ๋ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ๊น?
- 1๋ฒ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ , ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- 1๋ฒ๊ณผ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋ ธ๋์ค ๊ฐ์ฅ ์์๊ฐ์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- 2๋ฒ์ ๋ฐ๋ณตํ๋ค๊ฐ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ ๊ฒฝ์ฐ ์คํ์์ ๊ทธ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- 2,3๋ฒ ๋ฐ๋ณตํ๋ค.
์ฌ๊ทํจ์์ ํด๊ฒฐ๋ฐฉ์์ ์ด๋ ๋ค.
1. DFSํจ์์ 1๋ฒ ํจ์์ธ์๋ฅผ ๋ฃ๋๋ค
2. 1๋ฒ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ํ๊ณ ์ถ๋ ฅํ๋ค
3. 1๋ฒ ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๊ฐ์ฅ ์์ ๋ ธ๋๋ฅผ ๋ค์ dfsํจ์์ ๋ฃ๋๋ค.
4. ๋ฐ๋ณตํ๋ค.
๊ธ๋ก๋ง ์ฝ์ผ๋ฉด ์ ์ดํด๊ฐ ์ ๊ฐ ๊ฒ์ด๋ค. ์ฝ๋๋ฅผ ํตํด ํ์ธํด๋ณด์.
def dfs(start, visited, graph):
graph[start] = True
print(start, end = ' ')
for i in graph[start]:
if not visited[i]:
dfs(i,visited,graph)
graph = [
[],
[2, 4, 5],
[1, 3, 5],
[2, 5, 6],
[1, 5],
[1, 2, 4, 6],
[3, 5]
]
visited = [False]*9
dfs(1,visited,graph)
์์ ์ฝ๋์์๋ ๋ฐฉ๋ฌธํ์๋ฅผ ํด์ค์ผ ๊ฒน์น์ง ์๊ฒ ์ซ์๋ฅผ ์ถ๋ ฅํ ์ ์๋ค. ๋ฌธ์ ์ ๋ฐ๋ผ ๋ฐฉ๋ฌธํ์๋ฅผ ํด์ค์ผํ๋์ง, ์๋๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ๋ณํ ์ ์๋์ง๋ฅผ ํ์ ํ๊ณ ๋ฌธ์ ์ ์ ๊ทผํ๋ ๊ฒ์ด ์ค์ํ๋ค.
BFS
์์ DFS๋ ์ฌ๊ทํจ์๋ฅผ ํตํด ๊ตฌํํ๋ค. ์คํ์ผ๋ก ํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ๋ณด์๊ธฐ ๋๋ฌธ์ด๋ค.
BFS๋ ํ๋ฅผ ์ด์ฉํด์ ๊ตฌํํ ๊ฒ์ด๋ค. ์ ํํ๋ Collections๋ผ์ด๋ธ๋ฌ๋ฆฌ์ deque๋ฅผ ๊ฐ์ ธ์์ ํ๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.
์์ ๋ฌธ์ ๋ฅผ BFS๋ฅผ ํตํด ํ์ด๋ณด์.
- ํ์ ์์ ๋ ธ๋๋ฅผ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ๊ฐ ๋น์ด์์ ๋๊น์ง ํ์๋ฃ์ ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋ถ๋ฌ์ค๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๊ณ ์ถ๋ ฅํ๊ณ ๋ฅผ ๋ฐ๋ณตํ๋ค.
์ฝ๋๋ ์ด๋ ๋ค.
from collections import deque
def bfs(start, visited, graph):
queue = deque([start])
graph[start] = True
while queue:
x = queue.popleft()
print(x, end = ' ')
for i in graph[x]:
if not visited[i]:
visited[i] = True
queue.append(i)
graph = [
[2, 4, 5],
[1, 3, 5],
[2, 6],
[1, 5],
[1, 2, 4, 6],
[3, 5]
]
visited = [False] * 9
bfs(1, visited, graph)
๋ฐฉ๋ฌธํ๋์ง๋ฅผ ๊ฒ์ฌํ๊ธฐ ์ํด visited๋ฅผ ๋ฃ๋ ๊ฒ์ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ์ผ์ค์๊ฒ ์ฐ๋๋ก ํ์.
'์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค > DFS,BFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BFS ๋ฌธ์ (๋ฏธ๋ก ํ์ถ) - ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค (0) | 2020.08.25 |
---|---|
DFS๋ฌธ์ (์๋ฃ์ ์ผ๋ ค ๋จน๊ธฐ) - ์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค (0) | 2020.08.25 |