BOJ 풀이 노트: 이분 탐색 절단선과 0-1 BFS 감각 점검
· tech
오늘은 BOJ 2805와 13549를 묶어, 조건을 만족하는 최대값을 찾는 이분 탐색과 0/1 가중치 그래프에서 deque를 쓰는 0-1 BFS 구현 포인트를 실수 방지 중심으로 정리했다.
오늘은 서로 결이 다른 2문제를 선택했다.
- BOJ 2805 - 나무 자르기
- BOJ 13549 - 숨바꼭질 3
하나는 “정답(절단기 높이)의 최대값”을 찾는 문제고, 다른 하나는 “이동 비용이 0과 1이 섞인 최단시간” 문제다. 구현 난이도보다도, 어떤 알고리즘 모델로 보는지가 핵심인 조합이었다.
1) BOJ 2805 - 나무 자르기
문제 핵심 요약
나무들의 높이가 주어질 때, 절단기 높이 H를 정해 잘라 얻는 목재 총합이 M 이상이 되도록 해야 한다. 이 조건을 만족하는 H의 최댓값을 구하는 문제다.
접근 아이디어(왜 이 방법인지)
H를 높이면 얻는 목재량은 단조 감소한다. 즉,
- 어떤
H에서M이상을 얻을 수 있다면, - 더 낮은 높이에서는 항상 가능하고,
- 더 높은 높이에서는 불가능해질 수 있다.
이 단조성 때문에 완전탐색 대신 **매개변수 탐색(이분 탐색)**이 정석이다.
탐색 중 cut >= M이면 현재 H는 가능하므로 더 큰 값을 보기 위해 오른쪽으로, 아니면 왼쪽으로 이동한다.
시간/공간 복잡도
- 시간:
O(N log Hmax)(Hmax는 가장 높은 나무 높이) - 공간:
O(1)추가 공간 (입력 배열 제외)
실수하기 쉬운 포인트
cut합계를int로 두어 오버플로우가 나는 실수 (long long필요)- “가능한 높이의 최댓값”인데, 가능할 때 왼쪽으로 가는 방향 실수
- 이분 탐색 종료 후 정답 변수(
ans) 갱신 누락
C++ 코드 설명(핵심 라인)
if (cut >= M) {
ans = mid;
lo = mid + 1;
} else {
hi = mid - 1;
}
가능하면 더 높은 절단 높이를 시도해야 하므로 lo = mid + 1로 밀어야 한다. 이 한 줄 방향이 문제의 본질이다.
다른 풀이 가능성
- 높이를 0부터 순회하는 선형 탐색도 가능하지만 최악 시간에서 비현실적이다.
- 입력 범위를 감안하면 이 문제는 사실상 이분 탐색이 표준 해법이다.
2) BOJ 13549 - 숨바꼭질 3
문제 핵심 요약
수빈이 위치 N에서 동생 위치 K로 이동한다.
x -> 2x는 시간 0x -> x-1,x -> x+1은 시간 1
최소 시간을 구해야 한다.
접근 아이디어(왜 이 방법인지)
일반 BFS는 “간선 가중치가 모두 동일”할 때만 거리 보장이 된다. 이 문제는 가중치가 0과 1로 섞여 있으므로 0-1 BFS가 맞다.
핵심은 deque 사용:
- 비용 0 간선은
push_front - 비용 1 간선은
push_back
이렇게 하면 다익스트라의 우선순위 큐 없이도 거리 증가 순서를 유지할 수 있다.
시간/공간 복잡도
- 시간:
O(V + E)(0-1 BFS) - 공간:
O(V)
(여기서 V는 위치 범위 0..100000의 정점 수)
실수하기 쉬운 포인트
- 순간이동(비용 0)을 일반 간선처럼 뒤에 넣어서 거리 순서가 깨지는 실수
- 탐색 범위를 벗어난 인덱스 접근 (
<0,>100000) - “처음 방문”만으로 고정해서 더 짧은 거리 갱신을 막는 실수
C++ 코드 설명(핵심 라인)
if (nx <= MAX_POS && dist[nx] > dist[cur]) {
dist[nx] = dist[cur];
dq.push_front(nx);
}
비용 0 이동은 같은 거리 계층이므로 덱 앞에 넣어 즉시 처리한다.
if (nx >= 0 && dist[nx] > dist[cur] + 1) {
dist[nx] = dist[cur] + 1;
dq.push_back(nx);
}
비용 1 이동은 뒤에 넣어 다음 거리 계층에서 처리한다.
다른 풀이 가능성
- 다익스트라(우선순위 큐)로도 정확히 풀린다.
- 다만 가중치가 0/1로 제한된 문제에서는 0-1 BFS가 더 간결하고 상수 시간 면에서 유리하다.
오늘 정리 포인트:
- 조건을 만족하는 최대/최소 경계값을 찾는 문제는 “단조성”부터 점검하면 이분 탐색 적용 여부가 바로 보인다.
- 최단거리 문제에서 가중치 형태(동일/0-1/일반 양수)를 먼저 분류하면 BFS, 0-1 BFS, 다익스트라 선택이 훨씬 명확해진다.