미로 탈출 문제를 보고 dfs/bfs가 떠오르긴 했는데
dfs bfs 코드를 어케 짜는지 까먹었다 ..
그래서 다시 정리하기
- 탐색 시작 노드를 스택에 넣고 방문 처리
- 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 방문 처리. 방문하지 않은 인접 노드가 없다면 스택에서 최상단 노드 꺼냄
- 2번을 더이상 수행할 수 없을 때까지 반복
# dfs 메소드
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차원 리스트)
visited = [] # 각 노드가 방문한 정보를 표현하는 1차원 리스트
dfs(graph, 1, visited)
def DFS(node):
stack = []
stack.push(node)
while stack:
current = stack.pop()
if visited[current] == True:
continue
visited[current] = True
print(node)
for e in edge[node]:
stack.append(e)
- 탐색 시작 노드 정보를 큐에 삽입하고 방문 처리
- 큐에서 노드를 꺼내 방문하지 않은 인접 노드 정보를 모두 큐에 삽입하고 방문 처리
- 2번을 더 이상 수행할 수 없을 때까지 반복
from collections import deque
# BFS 메소드 정의
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차원 리스트)
visited = [] # 각 노드가 방문된 정보를 표현하는 1차원 리스트
bfs(graph, 1, visited) # bfs 함수 호출
그래프의 모든 정점을 방문하는 것이 주요한 문제
경로의 특징을 저장해야 하는 문제 - DFS
최단 거리 구하는 문제 - BFS
검색 대상 그래프의 크기