DFS
전체 순회시
from collections import deque
def dfs(graph, start):
visited = []
stack = deque([start]) # stack처럼 사용
while stack:
node = stack.pop() # top(오른쪽)에서 꺼냄; LIFO
if node not in visited: # 이미 방문한 경우 더 아래로 탐색하지 않음
visited.append(node) # 방문 리스트에 추가
stack.extend(reversed(graph[node]) # 왼쪽 자식부터 pop되도록 reverse
return visited
목표 탐색시
from collections import deque
def dfs(graph, start, goal):
visited = []
stack = deque([start]) # stack처럼 사용
while stack:
node = stack.pop() # top(오른쪽)에서 꺼냄; LIFO
if node == goal:
visited.append(node)
return visited # goal 찾으면 종료
if node not in visited:
visited.append(node)
stack.extend(reversed(graph[node])) # 왼쪽 자식부터 pop되도록 reverse
return visited # goal이 없으면 전체 방문 결과 반환
BFS
전체순회시
from collections import deque
def bfs(graph, start):
visited = []
queue = deque([start]) # queue처럼 사용
while queue:
node = queue.popleft() # 왼쪽에서 꺼냄; FIFO
if node not in visited: # 이미 방문한 경우 더 아래로 탐색하지 않음
visited.append(node) # 방문 리스트에 추가
queue.extend(graph[node]) # 자식들 추가함
return visited
목표 탐색시
from collections import deque
def bfs(graph, start, goal):
visited = []
queue = deque([start]) # queue처럼 사용
while queue:
node = queue.popleft() # FIFO
if node == goal:
visited.append(node)
return visited # goal 발견 시 바로 종료
if node not in visited:
visited.append(node)
queue.extend(graph[node])
return visited # goal이 없으면 전체 탐색 결과 반환
깊이 제한 탐색 (DLS)
from collections import deque
def dls(graph, start, limit):
visited = []
stack = deque([(start, 0)]) # 스택: (노드, 현재 깊이) 형태로 저장
while stack:
node, depth = stack.pop() # 스택의 top에서 노드와 그 깊이 꺼냄
if node not in visited:
visited.append(node) # 아직 방문하지 않은 노드라면 방문 처리
if depth < limit: # 현재 깊이가 제한보다 작을 경우만 자식 노드 탐색
for neighbor in reversed(graph[node]): # 왼쪽 자식부터 pop되게 역순으로 push
stack.append((neighbor, depth + 1)) # 자식 노드와 그 깊이를 push
return visited # 방문한 노드들의 순서 반환
- 노드를 현재 깊이와 함께 튜플로 스택에 저장한다.
- 현재 깊이가 제한보다 작을 경우만 자식 노드를 탐색하는 방식으로 DFS를 순회한다.
반복 심화 탐색 (ID-DFS)