728x90
DFS ์ BFS ๋ ๊ฐ๊ฐ Depth-First Search ์ Breadth-First Search ๋ก, ๊น์ด์ฐ์ ํ์๊ณผ ๋๋น์ฐ์ ํ์์ ๋ปํ๋ค. ๋์ ์ฐจ์ด์ ๊ณผ ์ฝ๋ ๊ตฌํ ๋ฐฉ๋ฒ์ ๊ตฌ์ฒด์ ์ผ๋ก ์์๋ณด๊ณ ์ ํ๋ค.
BFS
- ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐํ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ํ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
๊ตฌํ ๋จ๊ณ
- ํ์ ํ์ ์์ ๋ ธ๋๋ฅผ ์ฝ์ ํ๋ค.
- ํ์ front ๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๋ฐฉ๋ฌธ ํ์๋ฅผ ํ๊ณ , popleft() ๋ฅผ ํ๋ค.
- ํ์ฌ ๋ฐฉ๋ฌธํ๊ณ ์๋ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค๋ฉด ๊ทธ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค
- ํ์ฌ ๋ฐฉ๋ฌธํ๊ณ ์๋ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค๋ฉด ํ์ front ์ ๊บผ๋ธ๋ค
- ๋ฐ๋ณต ์คํํ์ฌ ํ๊ฐ ์์ ํ ๋น ๋ ์ข ๋ฃํ๋ค
from collections import deque # Python ์์ popleft() ๋ฅผ ํ๊ธฐ ์ํ ๋ชจ๋
# ๋
ธ๋์ ๋ฒํธ์ ๋ฐ๋ผ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ 2์ฐจ์ ๋ฐฐ์ด ํํํ ์ ์๋ค.
# ๊ฐ๋ น, 1 - 3 - 2 - 4 ํํ๋ก ์ฐ๊ฒฐ๋ ๊ทธ๋ํ๋ผ๋ฉด, [[], [3], [3, 4], [1, 2], [2]] ๋ก ํํ ๊ฐ๋ฅํ๋ค.
graph = [[], [3], [3, 4], [1, 2], [2]]
# ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ์ํ 1์ฐจ์ ๋ฐฐ์ด
# ์ด๊ธฐ๊ฐ์ False ๋ก ์ค์ ํด์ฃผ์ด์ผ node ๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด True ๋ก ์ ํํ์ฌ ํ์ํ ์ ์๋ค.
visited = [False] * (len(graph))
# ๋ฐฉ๋ฌธํด์ผํ ๋ชฉ๋ก์ ๋ด์ queue์ ๋ง๋ค์ด while ๋ฌธ ์คํ
queue = deque([1]) # ์ฒซ ๋ฒ์งธ๋ก ๋ฐฉ๋ฌธํ ๋
ธ๋
while len(queue) > 0 :
cur = queue.popleft()
print(cur)
for item in graph[cur]:
if visited[item] == False:
queue.append(item)
visited[cur] = True
DFS
- ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐํ์์ ๊ฐ์ฅ ๊น์ ๋ถ๋ถ์ (์ฆ, ํธ๋ฆฌ ๊ตฌ์กฐ์์ ๊ฐ์ฅ ํ์์ ์๋ ๋ ธ๋๋ฅผ) ๋จผ์ ๋ฐฉ๋ฌธํ์ฌ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์คํ ๋๋ ์ฌ๊ท๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
๊ตฌํ ๋จ๊ณ
- ์คํ์ ํ์ ์์ ๋ ธ๋๋ฅผ ์ฝ์ ํ๋ค
- ์คํ์ top ์ ๋ฐฉ๋ฌธํ ๋๋ง๋ค pop ์ผ๋ก ์ญ์ ํ๊ณ , ๋ฐฉ๋ฌธ ํ์๋ฅผ ํ๋ค
- ํ์ฌ ๋ฐฉ๋ฌธํ๊ณ ์๋ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค๋ฉด ๊ทธ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๋๋ค
- ํ์ฌ ๋ฐฉ๋ฌธํ๊ณ ์๋ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค๋ฉด ์คํ์ top ์ ๊บผ๋ธ๋ค
- ๋ฐ๋ณต ์คํํ์ฌ ์คํ์ด ์์ ํ ๋น ๋ ์ข ๋ฃํ๋ค
# ๋
ธ๋์ ๋ฒํธ์ ๋ฐ๋ผ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ 2์ฐจ์ ๋ฐฐ์ด ํํํ ์ ์๋ค.
# ๊ฐ๋ น, 1 - 3 - 2 - 4 ํํ๋ก ์ฐ๊ฒฐ๋ ๊ทธ๋ํ๋ผ๋ฉด, [[], [3], [3, 4], [1, 2], [2]] ๋ก ํํ ๊ฐ๋ฅํ๋ค.
graph = [[], [3], [3, 4], [1, 2], [2]]
# ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ์ํ 1์ฐจ์ ๋ฐฐ์ด
# ์ด๊ธฐ๊ฐ์ False ๋ก ์ค์ ํด์ฃผ์ด์ผ node ๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด True ๋ก ์ ํํ์ฌ ํ์ํ ์ ์๋ค.
visited = [False] * (len(graph))
# ๋ฐฉ๋ฒ 1
# ๋ฐฉ๋ฌธํด์ผํ ๋ชฉ๋ก์ ๋ด์ stack์ ๋ง๋ค์ด while ๋ฌธ ์คํ
stack = [1] # ์ฒซ ๋ฒ์งธ๋ก ๋ฐฉ๋ฌธํ ๋
ธ๋
while len(stack) > 0 :
cur = stack.pop()
print(cur)
visited[cur] = True
for item in graph[cur]:
if visited[item] == False:
stack.append(item)
๋ฐฉ๋ฒ 2
# ์ฌ๊ท์ ์ผ๋ก ์คํํ์ฌ ๋ฐฉ๋ฌธ ์์๋ฅผ ์ถ๋ ฅํ๋ ํจ์
dfs(graph, node, visited):
visited[node] = True
print(node)
for item in graph[node]:
if not visited[node]:
dfs(graph, item, visited)
for i in graph[node]:
'๐ป DEV > Algorithms & Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ][C++] ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ (0) | 2024.03.13 |
---|---|
[์๊ณ ๋ฆฌ์ฆ][C++] ์ฐ์ ์์ํ, ํํ (0) | 2024.03.11 |
[์๊ณ ๋ฆฌ์ฆ][C++] Dijkstra (๋ค์ต์คํธ๋ผ) / ์ต๋จ ๊ฒฝ๋ก ํ์ (0) | 2024.03.11 |
[Algorithms] ์๊ฐ๋ณต์ก๋ (Big-O Notation) ๋? (0) | 2021.07.08 |
[Data Structure] ์คํ(Stack) ๊ณผ ํ(Queue) (0) | 2021.07.07 |
๋๊ธ