DFS (๊น์ด ์ฐ์ ํ์) , BFS (๋๋น ์ฐ์ ํ์)
- -
ํ์ ์๊ณ ๋ฆฌ์ฆ (DFS)
DFS์ ์ ์
- Depth-First Search : ๊น์ด ์ฐ์ ์๊ณ ๋ฆฌ์ฆ, ๊ทธ๋ํ์ ๊น์ ๋ ธ๋๋ฅผ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๋๋ฌธ์ DFS๋ฅผ ์ดํดํ๋ ค๋ฉด ๊ทธ๋ํ์ ๊ทธ๋ํ ํ์์ ๊ดํ ๋ถ๋ถ์ ์์์ผํ๋ค. + ์คํ(stack)
- ํํ ๋ฏธ๋ก ํ์์ผ๋ก ๋น์ ํ๋ค. ๋ง๋ค๋ฅธ ๊ธธ์ ๋๋ฌํ ๋ ๊น์ง ํ์ชฝ๋ฐฉํฅ์ ํ์ํ๋ค๊ฐ, ๋์ ๋ณด๋ฉด ๋ค์ ๊ฐ๋ฆผ๊ธธ๋ก ๋์์์ ๋ค๋ฅธ ๊ธธ์ ํ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์์ ํ์์ ์ผ์ข ์ด๋ค.
DFS์ ์ฅ์
ํ์ฌ ํ์์ค์ธ ๋ ธ๋๋ค๋ง ๊ธฐ์ตํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ์ ๊ณ , ๋น์ฐํ ์ด์ผ๊ธฐ์ง๋ง ์ฐพ์ผ๋ ค๋ ๋ ธ๋๊ฐ ๊น์ ๊ฒฝ์ฐ์ BFS๋ณด๋ค ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค.
DFS ๋จ์
ํด๊ฐ ์๋ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ์๋ ๊ฒฝ๋ก๊ฐ ๋๋ ๋ ๊น์ง ํ์ํ๋ค. (์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์กฐ๊ฑด์ ์ง์ ํ๊ณ ์๋ ์์น๋ก ๋๋์์ค๋ Backtracking์ ์ฌ์ฉํ ์ ์๋ค.)
๊ทธ๋ํ
๊ทธ๋ํ๋ ์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ ธ๋(๋๊ทธ๋ผ๋ฏธ)์ ๊ฐ์ (์ ) ์ผ๋ก ํํ๋๋ค. ๊ทธ๋ํ์ ํ์์ด๋ผ๊ณ ํ๋ฉด ํ๋์ ๋ ธ๋๋ฅผ ์์์ผ๋ก ๋ค์์๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ณผ์ ์ ๋งํ๋ค. ๊ฐ์ ์ผ๋ก ์ง์ ์ฐ๊ฒฐ๋ ๋ ๋ ธ๋๋ ์ธ์ ํ๋ค(adjacent)๋ผ๊ณ ํ๋ค.
๊ทธ๋ํ๋ฅผ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ํํ
ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ํํ ๊ฐ๋ฅํ๋ค.
- ์ธ์ ํ๋ ฌ : 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ (Adjacency Matrix) ํ๋ ฌ์ ๋ํ๋ด๊ธฐ ์ํด 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
- ์ธ์ ๋ฆฌ์คํธ : ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ (Adjacency List) 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด์ผ ํ์ง๋ง, ๋ ธ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด๊ธฐ ์ํ๊ฒ์ด๋ฏ๋ก ์ธ์ ํ๋ ฌ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ดํดํด์ผํ๋ค.
์ธ์ ํ๋ ฌ ๋ฐฉ์
๊ทธ๋ํ์ ๋ ธ๋๊ฐ 1๋ถํฐ 6๊น์ง์ด๋ฏ๋ก ์ด 6๊ฐ์ด๋ค. ๊ทธ๋์ ๊ฐ 6ํ 6์ด์ด ๋๊ณ , ํ๋ ฌ์์ ๊ฐ ์์๊ฐ์ 1์ ์ฐ๊ฒฐ๋์๋ค๋ ์๋ฏธ์ด๊ณ , 0์ ์ฐ๊ฒฐ๋์ง ์์๋ค๋ ์๋ฏธ๊ฐ ๋๋ค.
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ๋ชจ๋ ๋ ธ๋์ ํด๋น ๋ ธ๋์ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
์๋ฅผ๋ค์ด์ ์ ๊ทธ๋ฆผ์์ ๋
ธ๋ 1์ ๋ณด๊ฒ๋๋ฉด, 5์ 2๊ฐ ์ฐ๊ฒฐ๋์ด์๋ค. ๊ทธ๋ผ 1๋ฒ ๋
ธ๋ ์๋ฆฌ์ ํด๋นํ๋ ์ ๋ณด๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. ad_list[1].append(2,5)
์ธ์ ํ๋ ฌ vs ์ธ์ ๋ฆฌ์คํธ
๋ญ ์ฌ์ฉํ๋๊ฒ ์ข์์ง ๋น๊ต.
์ธ์ ๋ฆฌ์คํธ๋ ํ์ํ๋งํผ๋ง (์ ์ ๊ณผ ๊ฐ์ ์ ๊ฐ์๋งํผ๋ง) ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํ๊ฒ๋์ง๋ง , ์ธ์ ํ๋ ฌ์ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์ ์ x์ ์ ๋งํผ์ ๊ณต๊ฐ์ ํ ๋นํด์ผํ๋ค.
- ์ธ์ ํ๋ ฌ : O(V^2)
- ์ธ์ ๋ฆฌ์คํธ : O(max(V+E))
ํ์ ์๋๊ฐ์๊ฒฝ์ฐ๋ ์ธ์ ํ๋ ฌ์ด ๋ ๋น ๋ฅด๋ค. ์๋ฅผ๋ค์ด์ 1๊ณผ 3์ ๊ด๊ณ๊ฐ ์๊ณ ์ถ๋ค๋ฉด array[1][3]
์ผ๋ก ์ ๊ทผํ๊ฒ๋๋ฉด O(1)์ด๋ค. ํ์ง๋ง ์ธ์ ๋ฆฌ์คํธ์์ ํ์ธํ๋ ค๋ฉด 1์ด๋ 3๊ณผ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์ ๋ถ ํ์ธํด์ผํ๋ค. ๋ฐ๋ผ์ ์ต์
์๊ฒฝ์ฐ์๋ O(N)์ด๋๋ค.
๊ฐ๋จํ๊ฒ ํ์ค๋ก ์ ๋ฆฌํ๋ฉด, Node๊ฐ ๋ง๋ค๋ฉด ์ธ์ ๋ฆฌ์คํธ๋ฅผ, Edge๊ฐ ๋ง๋ค๋ฉด ์ธ์ ํ๋ ฌ์ ์ฐ๋๊ฒ ์ข๋ค.
์ผ๋ฐ์ ์ธ ์ฝ๋ฉํ ์คํธ๋, PS์์๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ด๊ณผ๋ณด๋ค ์ฆ๊ธฐ๋๋ฌธ์ ์ธ์ ํ๋ ฌ์ ์ฐ๋๊ฒฝ์ฐ๊ฐ ๋ ๋ง๋ค๊ณ ํ๋ค.
DFS์ ๋์ ๋ฐฉ์
๋ฐฉ๋ฌธ ์ฒ๋ฆฌ : ์คํ์ ์ฝ์ ๋์๋ ๋ ธ๋๊ฐ ์ค๋ณต์ ์ผ๋ก ๋ ๋ค์ ์ฝ์ ๋์ง ์๋๋ก ํ๊ธฐ ์ํจ.
- ํ์์ ์์ํ ์ฒซ๋ฒ์งธ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๋ค. (๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ ํ๋ค)
- ์คํ์ ์ฝ์ ๋ ์ต์๋จ ๋ ธ๋ ์ฃผ๋ณ์ ๋ฐฉ๋ฌธํ์ง ์์๋ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด, ํด๋น ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๋ค.
- (์ด๋ ์ธ์ ๋ ธ๋๊ฐ 1๊ฐ๋ณด๋ค ๋ง๋ค๋ฉด ๋ ์์ ๋ ธ๋๋ถํฐ ์ฒ๋ฆฌํ๋ค.)
- 2๋ฒ์ ์คํํ ์ ์์ผ๋ฉด(์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด) , ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- 2 - 3๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. (๋ชจ๋ ๋ ธ๋๊ฐ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋ ๋๊น์ง)
์ด๋ ๊ฒ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ํ๊ฒ ๋๋ฉด ์๊ฐ ๋ณต์ก๋๋ O(N)์ด ๋๋ค.
์ฌ๊ทํจ์์ ์ํ์ ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ค.
๊ฐ๋จํ๊ฒ ์ฌ๊ทํจ์์ ๋์์๋ฆฌ๋ฅผ ๋ณด๋ฉด....
- ์ฌ๊ท์ ๋ด๋ถ ์ํ์ ๋ณด๋ฉด, ๊ฐ์ฅ ๋ง์ง๋ง์ ํธ์ถ๋์๋ ํจ์์ ์ํ์ด ๋๋์ผ, ๊ทธ ์์ ํจ์์ ํธ์ถ์ด ์ข ๋ฃ๋๋ค.
def recursive_function(i):
if i == 5:
return
print("%d ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ์คํ๋์์ต๋๋ค."%i)
recursive_function(i+1)
print("%d ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ์ข
๋ฃ๋์์ต๋๋ค."%i)
recursive_function(1)
>>> ์ถ๋ ฅ ๋ด์ฉ
1 ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ์คํ๋์์ต๋๋ค.
2 ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ์คํ๋์์ต๋๋ค.
3 ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ์คํ๋์์ต๋๋ค.
4 ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ์คํ๋์์ต๋๋ค.
4 ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ์ข
๋ฃ๋์์ต๋๋ค.
3 ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ์ข
๋ฃ๋์์ต๋๋ค.
2 ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ์ข
๋ฃ๋์์ต๋๋ค.
1 ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ์ข
๋ฃ๋์์ต๋๋ค.
graph
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False for i in range(len(graph))]
์ฌ๊ท๋ก ๊ตฌํํ dfs
def dfs(graph, node, visited) :
visited[node] = True
for i in graph[node]:
if not visited[i] :
dfs(graph, i , visited)
ํ์ ์๊ณ ๋ฆฌ์ฆ (BFS)
BFS์ ์ ์
Breadth-Frist-Search : ๋๋น ์ฐ์ ์๊ณ ๋ฆฌ์ฆ, ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
DFS์๋ ๋ค๋ฅด๊ฒ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค. ์ธ์ ํ ๋ ธ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ ๋ฃ๊ณ , ๋จผ์ ๋ค์ด์จ ๋ ธ๋๊ฐ ๋จผ์ ๋๊ฐ๊ฒ๋์ด ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๊ฒ ๋๋ ๊ตฌ์กฐ์ด๋ค.
BFS ๊ตฌํ
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ด๊ณ , ๊บผ๋ธ ๋ ธ๋ ์ฃผ๋ณ์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ "๋ชจ๋" ํ์ ์ฝ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ์ ๋ ํ๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๋ค. (์์ ์ซ์์ ๋ ธ๋๋ถํฐ ์ฝ์ )
- 2๋ฒ์ ๋ฐ๋ณตํ๋ค.
DFS์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ฐ๋ณต์ก๋๋ O(N)์ด๋ค.
from collections import deque
def bfs(graph, start, visited):
queue = deque([start])
visited[start] = True
while queue:
node = queue.popleft()
for i i n graph[node]:
if not visited[i]:
queue.append(i)
visited[i] = True
* BFS / DFS ๊ด๋ จ ๋ฌธ์
https://www.acmicpc.net/problem/2178
#๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ BFS๋ฌธ์
from collections import deque
n , m = map(int, input().split())
grid = []
dx = [0,0,1,-1]
dy = [1,-1,0,0]
for _ in range(n):
grid.append(list(input()))
def bfs(x,y):
q = deque()
q.append((x,y))
grid[0][0] = 1
while(q):
x,y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= n or ny >= m :
continue
if grid[nx][ny] == "1":
q.append((nx,ny))
grid[nx][ny] = grid[x][y] + 1
return grid[n-1][m-1]
print(bfs(0,0))
https://infinitt.tistory.com/347
์์ํ๊ฒ DFS์ BFS๋ฅผ ๊ตฌํํ๋ ๋ฌธ์ ์ด๋ค. ๊ฐ๋ ์ ๊ณต๋ถํ๊ณ ์ฒ์์ผ๋ก ํ๋ฉด ์ข์๊ฒ ๊ฐ๋ค.
'๐งฎ PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] (Python) - ํ๋ฆฐํฐ (0) | 2021.06.23 |
---|---|
๋ฐฑ์ค (boj) ํ์ด์ฌ - 1260 : DFS์ BFS (0) | 2021.06.22 |
์คํ, ํ, ๋ฑ (stack, queue, daque) (0) | 2021.06.16 |
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (Greedy Algorithm) , ํ์ (0) | 2021.06.13 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Python) - ์นดํซ (0) | 2021.06.12 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค