Computer Science 🔍/Algorithm
[Python] BFS/DFS 구현 기본 코드 & 기초 문제
nowall
2024. 7. 5. 23:49
DFS / BFS 구현 예제
일반적인 경우 실제 수행 시간은 BFS가 DFS보다 좋은 편이다.
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)
# 그래프를 2차원 인접 리스트 방식으로 표현함
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)
동작 원리 : 스택
구현 방법 : 재귀 함수 이용
BFS
from collections import deque
def bfs(graph, start, visited):
queue = deque([start]) # argument가 '[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
# 그래프를 2차원 인접 리스트 방식으로 표현함
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)
👉 코드 상의 4번째 줄 부가 설명
deque는 문자열, 튜플, 리스트 등 iterable 객체를 받아서 덱을 초기화한다.
만약 deque(start)를 넣고 start가 1이라면 deque(1)은 에러를 발생시킨다.
하지만 만약 start가 'abc'와 같은 문자열이라면 문자열의 각 문자를 요소로 처리한다.
어쨌든 위 코드에서 deque([start])는 start 값을 리스트로 감싸서 하나의 요소로 덱에 넣어 초기화한다.
동작 원리 : 큐
구현 방법 : 큐 자료구조 이용
문제
🥈 백준 1260. DFS와 BFS
https://www.acmicpc.net/problem/1260
from collections import deque
n, m, v = map(int, input().split())
graph = [[] for _ in range(n+1)]
for i in range(m):
x, y = map(int, input().split())
graph[x].append(y)
graph[y].append(x)
for i in range(1, n+1):
graph[i] = sorted(graph[i])
def dfs(v, visited, graph):
visited[v] = True
print(v, end=' ')
for node in graph[v]:
if not visited[node]:
dfs(node, visited, graph)
def bfs(v, visited, graph):
queue = deque([v])
visited[v] = True
while queue:
node = queue.popleft()
print(node, end=' ')
for item in graph[node]:
if not visited[item]:
queue.append(item)
visited[item] = True
visited = [False] * (n+1)
dfs(v, visited, graph)
print()
visited = [False] * (n+1)
bfs(v, visited, graph)