๐ ์๋ฃ๊ตฌ์กฐ ๊ธฐ์ด
ํ์์ด๋ ๋ง์ ์์ ๋ฐ์ดํฐ ์ค์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ ์๋ฏธํ๋ค. ํ๋ก๊ทธ๋๋ฐ์์๋ ๊ทธ๋ํ, ํธ๋ฆฌ ๋ฑ์ ์๋ฃ๊ตฌ์กฐ ์์์ ํ์์ ํ๋ ๋ฌธ์ ๋ฅผ ์์ฃผ ๋ค๋ฃฌ๋ค. ๋ํ์ ์ธ ํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก DFS์ BFS๋ฅผ ๊ผฝ์ ์ ์๋๋ฐ ์ด ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ๋ฅผ ์ ๋๋ก ์ดํดํด์ผ ์ฝ๋ฉ ํ ์คํธ์ ํ์ ๋ฌธ์ ์ ํ์ ํ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ DFS์ BFS๋ฅผ ์ ๋๋ก ์ดํดํ๋ ค๋ฉด ๊ธฐ๋ณธ ์๋ฃ๊ตฌ์กฐ์ธ ์คํ๊ณผ ํ์ ๋ํ ์ดํด๊ฐ ์ ์ ๋์ด์ผ ํ๋ฏ๋ก ์ฌ์ ํ์ต์ผ๋ก ์คํ๊ณผ ํ, ์ฌ๊ท ํจ์๋ฅผ ๊ฐ๋จํ ์ ๋ฆฌํ๊ณ ์ ํ๋ค.
์๋ฃ๊ตฌ์กฐ๋ '๋ฐ์ดํฐ๋ฅผ ํํํ๊ณ ๊ด๋ฆฌํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ตฌ์กฐ'๋ฅผ ์๋ฏธํ๋ค. ๊ทธ ์ค ์คํ๊ณผ ํ๋ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ด ๊ฐ๋ ์ผ๋ก ๋ค์์ ๋ ํต์ฌ์ ์ธ ํจ์๋ก ๊ตฌ์ฑ๋๋ค.
- ์ฝ์ (Push): ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ค.
- ์ญ์ (Pop): ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค.
์ค์ ๋ก ์คํ๊ณผ ํ๋ฅผ ์ฌ์ฉํ ๋๋ ์ฝ์ ๊ณผ ์ญ์ ์ธ์๋ ์ค๋ฒํ๋ก์ ์ธ๋ํ๋ก๋ฅผ ๊ณ ๋ฏผํด์ผ ํ๋ค. ์ค๋ฒํ๋ก๋ ํน์ ํ ์๋ฃ๊ตฌ์กฐ๊ฐ ์์ฉํ ์ ์๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ์ด๋ฏธ ๊ฐ๋ ์ฐฌ ์ํ์์ ์ฝ์ ์ฐ์ฐ์ ์ํํ ๋ ๋ฐ์ํ๋ค. ์ฆ, ์ ์ฅ ๊ณต๊ฐ์ ๋ฒ์ด๋ ๋ฐ์ดํฐ๊ฐ ๋์ณํ๋ฅผ ๋ ๋ฐ์ํ๋ค. ๋ฐ๋ฉด์ ํน์ ํ ์๋ฃ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๊ฐ ์ ํ ๋ค์ด ์์ง ์์ ์ํ์์ ์ญ์ ์ฐ์ฐ์ ์ํํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ํ ์๋ ์ํ์ด๋ฏ๋ก ์ธ๋ํ๋ก๊ฐ ๋ฐ์ํ๋ค.
โ ์คํ
์คํ์ ๋ฐ์ค ์๊ธฐ์ ๋น์ ํ ์ ์๋ค. ํํ ๋ฐ์ค๋ ์๋์์๋ถํฐ ์๋ก ์ฐจ๊ณก์ฐจ๊ณก ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์ ์๋ ๋ฐ์ค๋ฅผ ์น์ฐ๊ธฐ ์ํด์๋ ์์ ์๋ ๋ฐ์ค๋ฅผ ๋จผ์ ๋ด๋ ค์ผ ํ๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ์ ์ ํ์ถ ๊ตฌ์กฐ ๋๋ ํ์ ์ ์ถ ๊ตฌ์กฐ๋ผ๊ณ ํ๋ค.
ํ์ด์ฌ์์ ์คํ์ ์ด์ฉํ ๋์๋ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค. ๊ธฐ๋ณธ ๋ฆฌ์คํธ์์ append()์ pop() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์คํ ์๋ฃ๊ตฌ์กฐ์ ๋์ผํ๊ฒ ๋์ํ๋ค. append() ๋ฉ์๋๋ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ๋ค์ชฝ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ณ , pop() ๋ฉ์๋๋ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ๋ค์ชฝ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๊ธฐ ๋๋ฌธ์ด๋ค.
โ ํ
ํ๋ ๋๊ธฐ ์ค์ ๋น์ ํ ์ ์๋ค. ์ฐ๋ฆฌ๊ฐ ํํ ๋์ด๊ณต์์ ์ ์ฅํ๊ธฐ ์ํด ์ค์ ์ค ๋, ๋จผ์ ์จ ์ฌ๋์ด ๋จผ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค. ๋ฌผ๋ก ์์น๊ธฐ๋ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ๋์ค์ ์จ ์ฌ๋์ผ์๋ก ๋์ค์ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ํํ '๊ณต์ ํ' ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ๋น์ ๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ์ ์ ์ ์ถ ๊ตฌ์กฐ๋ผ๊ณ ํ๋ค.
ํ์ด์ฌ์ผ๋ก ํ๋ฅผ ๊ตฌํํ ๋๋ collections ๋ชจ๋์์ ์ ๊ณตํ๋ deque ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์. deque๋ ์คํ๊ณผ ํ์ ์ฅ์ ์ ๋ชจ๋ ์ฑํํ ๊ฒ์ธ๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋นผ๋ ์๋๊ฐ ๋ฆฌ์คํธ ์๋ฃํ์ ๋นํด ํจ์จ์ ์ด๋ฉฐ queue ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํ๋ค.
โ ์ฌ๊ท ํจ์
DFS์ BFS๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์ฌ๊ท ํจ์๋ ์ดํดํ๊ณ ์์ด์ผ ํ๋ค. ์ฌ๊ท ํจ์๋ ์๊ธฐ ์์ ์ ๋ค์ ํธ์ถํ๋ ํจ์๋ฅผ ์๋ฏธํ๋ค. ์ฌ๊ท ํจ์๋ฅผ ๋ฌธ์ ํ์ด์์ ์ฌ์ฉํ ๋๋ ์ฌ๊ท ํจ์๊ฐ ์ธ์ ๋๋ ์ง, ์ข ๋ฃ ์กฐ๊ฑด์ ๊ผญ ๋ช ์ํด์ผ ํ๋ค. ์์นซ ์ข ๋ฃ ์กฐ๊ฑด์ ๋ช ์ํ์ง ์์ผ๋ฉด ํจ์๊ฐ ๋ฌดํ ํธ์ถ๋ ์ ์๋ค. ์ฌ๊ท ํจ์๋ ๋ด๋ถ์ ์ผ๋ก ์คํ ์๋ฃ๊ตฌ์กฐ์ ๋์ผํ๋ค.
์ฌ๊ทํจ์์ ๋ํ์ ์ธ ์์ ์ธ ํฉํ ๋ฆฌ์ผ์ ๊ตฌํํด๋ณด์๋ค.
def factorial(n):
if n <= 1:
return 1
else:
return n*factorial(n-1)
print(factorial(5))
๐ DFS
DFS๋ Depth-First Search, ๊น์ด ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ํน์ ํ ๊ฒฝ๋ก๋ก ํ์ํ๋ค๊ฐ ํน์ ํ ์ํฉ์์ ์ต๋ํ ๊น์์ด ๋ค์ด๊ฐ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ, ๋ค์ ๋์๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ฉฐ ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ ์ธ์ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- (2)๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
๊น์ด ์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ธ DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค๋ ์ ์์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค. ์ค์ ๋ก๋ ์คํ์ ์ฐ์ง ์์๋ ๋๋ฉฐ ํ์์ ์ํํจ์ ์์ด์ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N๊ฐ์ธ ๊ฒฝ์ฐ O(N)์ ์๊ฐ์ด ์์๋๋ค๋ ํน์ง์ด ์๋ค.
๋ํ, 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)
๐ BFS
BFS ์๊ณ ๋ฆฌ์ฆ์ '๋๋น ์ฐ์ ํ์'์ด๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค. ์ฝ๊ฒ ๋งํด ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. BFS ๊ตฌํ์์๋ ์ ์ ์ ์ถ ๋ฐฉ์์ธ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ ์์ด๋ค. ์ธ์ ํ ๋ ธ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ ๋ฃ๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋จผ์ ๋ค์ด์จ ๊ฒ์ด ๋จผ์ ๋๊ฐ๊ฒ ๋์ด, ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์์ ์งํํ๊ฒ ๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ๋์ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- (2)๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
๋๋น ์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ธ BFS๋ ํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค๋ ์ ์์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค. ์ค์ ๋ก ๊ตฌํํจ์ ์์ด ์์ ์ธ๊ธํ ๋๋ก deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ ํ์์ ์ํํจ์ ์์ด O(N)์ ์๊ฐ์ด ์์๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ์ํ ์๊ฐ์ DFS๋ณด๋ค ์ข์ ํธ์ด๋ค.
from collections import deque
def bfs(graph,start,visited):
queue=deque([start])
visited[start] = True
while queue:
v=queue.popleft
print(v,end=' ')
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
์ฐธ๊ณ
- ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ
'Coding Test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL/10.23] Algorithm: DFS/BFS (2) | 2023.10.23 |
---|---|
[TIL/10.23] Algorithm: DFS/BFS (0) | 2023.10.22 |
[TIL/10.20] Algorithm: ๊ตฌํ (0) | 2023.10.19 |
[TIL/10.19] Algorithm: ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (0) | 2023.10.19 |
[TIL/10.14] ๋ฐฑ์ค - 2์ฐจ์ ๋ฐฐ์ด ๊ณจ๋ผํ๊ธฐ (0) | 2023.10.14 |