문제 요약
| 항목 | 설명 |
|---|---|
| 입력 | 정점 개수 N, 간선 개수 M, 시작 정점 V |
| 그래프 | 양방향 그래프 |
| 조건 | 방문 가능한 정점이 여러 개면 번호가 작은 정점을 먼저 방문 |
| 출력 | 첫 줄은 DFS 방문 순서, 둘째 줄은 BFS 방문 순서 |
문제에서 중요한 조건은 “방문할 수 있는 정점이 여러 개인 경우 번호가 작은 것을 먼저 방문한다”는 점입니다. 그래서 인접 리스트 정렬이 핵심입니다. [Source](https://www.acmicpc.net/problem/1260)
이 문제의 핵심 개념
1. DFS는 깊게 들어간다
현재 갈 수 있는 정점이 있으면 끝까지 깊게 내려갑니다. 보통 재귀로 구현하면 자연스럽게 DFS 흐름이 만들어집니다.
2. BFS는 가까운 정점부터 넓게 간다
시작 정점에서 한 번에 갈 수 있는 정점들을 먼저 모두 처리하고, 그 다음 단계의 정점들을 처리합니다. 큐를 사용하면 BFS 흐름을 구현할 수 있습니다.
3. 정렬하지 않으면 답이 달라질 수 있다
문제는 작은 번호부터 방문하라고 했기 때문에 각 정점의 인접 리스트를 sort() 해야 합니다.
예제 1 시각화
예제 입력 1
4 5 1
1 2
1 3
1 4
2 4
3 4
1 2
1 3
1 4
2 4
3 4
시작 정점은 1입니다. 연결 정보는 양방향이므로 서로 양쪽에 모두 저장해야 합니다.
그래프를 그림으로 보면
2 3
\ / \
1 4
1은 2, 3, 4와 연결되고, 4는 2와 3과도 연결되어 있습니다.
왜 DFS와 BFS의 결과가 다를까?
DFS 탐색 흐름
1 → 2 → 4 → 3
DFS는 1에서 가장 작은 번호 2로 가고, 거기서 더 갈 수 있으면 계속 깊이 들어갑니다. 그래서 결과가 1 2 4 3이 됩니다. [Source](https://www.acmicpc.net/problem/1260)
BFS 탐색 흐름
1 → 2 3 4
BFS는 1에서 바로 갈 수 있는 정점들을 먼저 큐에 넣고 순서대로 꺼내므로 결과가 1 2 3 4가 됩니다. [Source](https://www.acmicpc.net/problem/1260)
정리된 최종 코드
from collections import deque
def bfs(graph, start):
visited = []
queue = deque([start])
visited.append(start)
while queue:
current = queue.popleft()
for next_node in graph[current]:
if next_node not in visited:
visited.append(next_node)
queue.append(next_node)
return visited
def dfs(graph, start, visited=None):
if visited is None:
visited = []
visited.append(start)
for next_node in graph[start]:
if next_node not in visited:
dfs(graph, next_node, visited)
return visited
n, m, v = map(int, input().split())
graph = [[] for _ in range(n + 1)]
for _ in range(m):
node1, node2 = map(int, input().split())
graph[node1].append(node2)
graph[node2].append(node1)
for i in range(1, n + 1):
graph[i].sort()
print(*dfs(graph, v))
print(*bfs(graph, v))
코드 한 줄씩 설명
이 코드에서 꼭 기억할 포인트
자주 하는 실수
마무리 정리
이 문제의 핵심 한 문장
같은 그래프라도 DFS는 깊이 우선, BFS는 너비 우선이기 때문에 방문 순서가 달라지고, 문제 조건에 맞는 출력을 위해서는 인접 리스트 정렬이 꼭 필요합니다.
문제는 같은 그래프를 시작 정점 V에서 DFS와 BFS로 각각 탐색했을 때의 방문 순서를 출력하는 것입니다. 여러 정점을 방문할 수 있으면 작은 번호를 먼저 가야 하므로, 그래프를 만든 뒤 각 인접 리스트를 정렬하는 것이 핵심입니다.
'크래프톤 정글 > 정글에서 문제풀기' 카테고리의 다른 글
| [정글 알고리즘] - [중]-백준 5639 이진 검색 트리 - 골드4 (1) | 2026.03.23 |
|---|---|
| [정글 알고리즘] - [중]-백준 11724 연결 요소의 개수 풀이 실버2 (4) | 2026.03.21 |
| [정글 알고리즘] - [중] -백준 11725 트리의 부모 찾기 풀이- 실버2 (0) | 2026.03.21 |
| [정글 알고리즘] - [중] -백준 2294 동전 2- 골드 5 (1) | 2026.03.21 |
| [정글 알고리즘] - [중] -백준 2178 미로 탐색 실버1 (0) | 2026.03.21 |