DFS/BFS ์ฒ์ ๋ฐฐ์ธ ๋ (์๋ฆฌ ์๋ ์์ฐ์ฑ )
๐DFS(Deep -First -Search)
DFS
- ๊น์ด ์ฐ์ ํ์
- ๋ฏธ๋ก ์ฐพ๊ธฐ /๋ชจ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ถํ ๋ ์ฌ์ฉ
์๋ ์๋ฆฌ
- ํ์ ์์ ๋
ธ๋๋ฅผ ์คํ์ ์ฝ์
ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ์คํ์ ์ต์๋จ ๋
ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋๊ฐ ์์ผ๋ฉด, ๊ทธ ์ธ์ ๋
ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋
ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- 2๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
def dfs(graph, v, visited):
visited[v] = True
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False] * 9
dfs(graph, 1, visited)
์ฝ๋์ค๋ช
- graph ๋ ์ด๋ป๊ฒ ์ด์ด์ ธ์๋ ๋ํ๋ด์ฃผ๋ ๋ฆฌ์คํธ์ด๋ค.
- v ๋ ์ธ๋ฑ์ค ์์น / visited ๋ฅผ ํตํด ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ๊ตฌ๋ถ
- ์ผ๋จ vistied [False,False,False,False,False,False,False,False,False] ๋ฃ๋๋ค
- dfs(graph, 1, visited) ์ฌ๊ทํจ์๋ฅผ ๋๋ฉด์ ๋ฐฉ๋ฌธํ์ง ์์ graph๋ฅผ ์ฐพ๋๋ค.
๐BFS(Breadth-First-Search)
BFS
- ๋๋น ์ฐ์ ํ์
- ์ต๋จ ๊ฒฝ๋ก ํ ๋ ์ฌ์ฉ
์๋์๋ฆฌ
- ํ์ ์์ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋
ธ๋๋ฅผ ๊บผ๋ด ํด๋น ๋
ธ๋์ ์ธ์ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์
ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- 2๋ฒ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
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
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False] * 9
bfs(graph, 1, visited)
์ฝ๋ ์ค๋ช
- ๋ฐฉ๋ฌธํ ์์ ๋
ธ๋๋ฅผ queue ๋ด์๋
ผ๋ค
- vistied ๋ฐฐ์ด ์ธ๋ฑ์ค์ True๋ก ๋ฐ๊ฟ๋๋๋ค.
- queue ์์๊ฐ empty ํ ๋ ๊น์ง ๋ฐ๋ณตํ๋ค
- queue ์์ popleft()ํ์ฌ v ์ ์ ์ฅํ๊ณ
- v๋ฅผ printํ๋ค # 1
- ํด๋น ์์์ ์ฐ๊ฒฐ๋, ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์์๋ค์ ํ์ ์ฝ์