무언가를 찾는 탐색에서 가능한 모든 경우의 수를 모두 확인
하는 방법이 바로 완전탐색입니다.
윌리를 찾아 봅시다. 우리는 다음과 같이 다양한 방법으로 윌리를 찾으려 할 것입니다.
어떤 방식
으로 모든 수를 확인할 것인가?'에 대한 물음에 우리는 BFS
혹은 DFS
를 답할 수 있습니다. 즉 BFS
와 DFS
는 가등한 모든 경우의 수를 확인하는 방법
의 종류라는 뜻입니다.깊이 우선 탐색
은 간단히 말해 다음과 같이 행동하는 것입니다.선택한 길에서 내려갈 수 있는 최대한의 깊이
까지 내려갔다가, 다른 곳을 찾기 때문에 깊이 우선 탐색
이라고 불립니다.
너비 우선 탐색
은 위에 있는것들부터 먼저 확인하는
방식입니다.
queue
를 통해, DFS는 stack
을 통해 구현할 수 있습니다.아래와 같은 트리가 있다고 생각해 봅시다.
BFS는 너비우선이기 때문에 A,B,C,D,E,F,G순서가 되어야 합니다. 그런데 A는 D,E,F,G의 정보를 알고 있을까요? A는 자식의 정보만 알고 있을 뿐 그 밑의 정보는 알지 못합니다. 그렇기 때문에 B와C를 방문했을 때 D,E,F,G에 대한 정보를 기억해 둬야 합니다.
DFS는 일단 한방향으로 직진하고, 더이상 직진할 수 없을때 처음이 아니라 가장 최근
갈림길로 돌아가야 하기 때문에 후입선출의 관계가 성립합니다. (후입선출은 곧 스택 구조를 의미합니다.)
#BFS
from collections import deque
def BFS(graph, start):
queue = deque([])
visited = [False]*len(graph)
queue.append(start)
visited[start-1] = True
while queue:
x = queue.popleft()
print(x)
for i in graph[x]:
if not visited[i-1]:
queue.append(i)
visited[i-1] = True
#DFS
def DFS(graph,start):
stack = []
visited = [False]*len(graph)
stack.append(start)
visited[start-1] = True
while stack:
x = stack.pop()
print(x)
for i in graph[x]:
if not visited[i-1]:
stack.append(i)
visited[i-1] = True