백준 1697 숨바꼭질은 BFS의 대표적인 입문 문제다.
하지만 단순히 “최단거리니까 BFS”라고 외우기보다는 왜 BFS가 맞는지를 스스로 납득하는 과정이 중요하다.
이 글에서는 문제를 보고 어떤 사고 과정을 통해 BFS로 접근하게 되었는지 정리해보았다.
1. 문제 요약
수빈이는 현재 위치 N에 있고, 동생은 K에 있다.
수빈이는 다음 세 가지 방법으로 이동할 수 있다.
X → X - 1
X → X + 1
X → 2 * X
모든 이동은 1초가 걸린다.
목표는
동생을 찾는 최소 시간을 구하는 것이다.
2. 처음 들었던 의문 — 그리디 아닌가?
처음 문제를 보면 이런 생각이 들 수 있다.
- K보다 작으면 *2가 빠르지 않을까?
- K보다 크면 -1 하면 되지 않을까?
즉 현재 목표에 가까워지는 선택을 계속 하면 되지 않을까?
라는 생각이 자연스럽게 나온다.
하지만 실제로는 그렇지 않다.
예를 들어
N = 5
K = 17
직관적으로는
5 → 10 → 20 → 19 → 18 → 17
처럼 가고 싶지만
더 빠른 경로는
5 → 4 → 8 → 16 → 17
이다.
즉 목표와 잠깐 멀어지는 선택이 오히려 최단경로가 될 수 있다.
이 순간
그리디 방식은 사용할 수 없다는 결론에 도달했다.
3. 그래프로 생각하기
문제를 다시 보면 사실 이것은 그래프 문제이다.
각 숫자를 노드라고 생각하면
X
├─ X-1
├─ X+1
└─ 2X
이렇게 연결된다.
예를 들어 5라면
5
├─4
├─6
└─10
즉 우리는
그래프에서 N → K까지의 최단거리를 구하고 있다.
4. 이동 비용이 모두 동일하다
이 문제에서 중요한 조건이 하나 있다.
모든 이동 = 1초
그래프 이론에서
모든 간선의 가중치가 동일한 최단거리 문제
는 BFS로 해결할 수 있다.
왜냐하면 BFS는 탐색을 이렇게 진행하기 때문이다.
거리 0
거리 1
거리 2
거리 3
...
즉 레벨 순서로 탐색한다.
그래서 어떤 위치에 처음 도착한 순간이 곧 최단거리가 된다.
5. BFS에서 들었던 또 다른 의문
BFS 풀이를 보다가 이런 의문이 들었다.
이동할 때마다 카운트를 증가시키면
나중에 돌아서 다시 오면 값이 꼬이지 않을까?
하지만 BFS에서는 이 문제가 발생하지 않는다.
이유는 방문 체크 때문이다.
BFS에서는
처음 방문한 순간
에만 거리 값을 기록한다.
그리고 같은 위치는 다시 방문하지 않는다.
즉
dist[next] = dist[current] + 1
이 값은 한 번만 기록된다.
그래서 값이 덮어쓰여서 꼬일 일이 없다.
6. BFS 상태 정의
이 문제에서 BFS의 상태는 단순하다.
현재 위치 x
즉
state = x
다음 상태는
x-1
x+1
2x
이다.
7. 방문 배열 설계
문제에서 위치 범위는
0 ≤ x ≤ 100000
이다.
따라서 방문 배열은 다음처럼 만들 수 있다.
visited[100001]
또는 거리까지 함께 저장하면
dist[100001]
이 된다.
8. BFS 설계
BFS 구조는 다음과 같다.
queue 생성
시작점 push
while queue:
현재 위치 pop
다음 위치 생성
방문 안 했으면 queue push
이 문제에 적용하면
현재 위치 x
다음 위치
- x-1
- x+1
- 2x
이다.
2️⃣ 그래프로 생각하면 문제 구조가 보인다
숫자 → 노드
이동 → 간선
3️⃣ BFS의 핵심 성질
처음 도착한 순간 = 최단거리
마무리
숨바꼭질 문제는 단순한 BFS 문제처럼 보이지만
다음 개념을 이해하는 데 중요한 문제였다.
그래프 최단거리
BFS 탐색
방문 처리
이 문제를 통해 “최단거리 문제 → BFS”라는 판단 기준을 확실하게 잡을 수 있었다.
'프로그래밍 > 코딩 테스트, 더 이상 미룰 수 없다' 카테고리의 다른 글
| [코딩 테스트, 더 이상 미룰 수 없다] 구현 문제 가이드 (0) | 2026.03.19 |
|---|---|
| [코딩테스트, 더 이상 미룰 수 없다] BOJ 2468 - DFS를 도구로 바라보기 (0) | 2026.03.19 |
| [코딩테스트, 더 이상 미룰 수 없다] BOJ 11053 - Dynamic Programming (DP) (0) | 2026.03.18 |
| [코딩 테스트, 더 이상 미룰 수 없다] BFS/DFS 문제에서 가장 먼저 해야 할 것 — 입력 유형 구분하기 (0) | 2026.03.16 |
| [코딩테스트, 더 이상 미룰 수 없다] BOJ 2206 벽 부수고 이동하기 — BFS에서 상태 확장(state expansion) 이해하기 (0) | 2026.03.16 |