백준 1260 DFS와BFS 파이썬
접근방식
- 2차원 리스트로 노드 간 연결 정보를 저장합니다.
- 양방향이기 때문에 양쪽 다 저장해줍니다.
- 문제에서 제시한 조건 중 방문 가능한 정점이 여러 개인 경우, 번호가 낮은 것부터 방문해야 합니다.
- 따라서 시작 전에 graph의 정점을 오름차순으로 정렬해줍니다.
- 방문 처리를 위해 visited 리스트를 만들어줍니다.
- dfs의 경우, 시작 노드인 v를 방문처리 해주고, 해당 위치의 리스트를 탐색해서
- 재귀함수를 실행해줍니다.
- bfs의 경우, deque을 이용해서 시작 노드를 먼저 append 시켜줍니다.
- 이후 popleft 해주면서 큐에 다시 넣어주고 출력하는 것을 반복합니다.
import sys
from collections import deque
input = lambda: sys.stdin.readline().rstrip()
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(n+1):
graph[i].sort()
# DFS
visited = [False for _ in range(n+1)]
def dfs(graph, v, visited):
# 현재 노드 방문처리
visited[v] = True
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
visited[i] = True
# 재귀함수
dfs(graph, i, visited)
# BFS
def bfs(graph, v, visited):
queue = deque([v])
visited[v] = True
while queue:
i = queue.popleft()
print(i, end = ' ')
for j in graph[i]:
if not visited[j]:
queue.append(j)
visited[j] = True
dfs(graph, v, visited)
print()
# visited함수를 이미 dfs에서 활용했기 때문에 재선언
visited = [False for _ in range(n+1)]
bfs(graph, v, visited)
해당 문제는 실버 2 난이도의 DFS, BFS 문제였습니다.
두 알고리즘을 비교하는 데에 있어서 좋은 문제라고 생각합니다.
알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.
Just do it & Keep steady
댓글남기기