매일 BOJ
(매일 BOJ) C++ 17266번 어두운 굴다리
norepinephrine
2025. 7. 27. 15:27
이번 문제는 17266번 어두운 굴다리이다.

접근법
- 특정 밝기 거리 X를 기준으로, 가로등들이 굴다리 전체를 커버할 수 있는지를 확인한다.
- 이분 탐색을 통해 최소한의 X를 찾는다.
알고리즘 설계
- 이분 탐색 범위는 start = 1, end = N
- X가 주어졌을 때, 가로등이 굴다리 [0, N]을 모두 커버할 수 있는지를 판단
- 판단 기준
- 첫 번째 가로등이 0보다 멀면 안 됨 → pos[0] - X > 0이면 실패
- 두 가로등 사이가 비면 안 됨 → pos[i+1] - pos[i] > 2 * X이면 실패
- 마지막 가로등이 끝까지 도달해야 함 → pos.back() + X < N이면 실패
작성코드
# include <bits/stdc++.h>
using namespace std;
int main (void){
ios::sync_with_stdio(0); cin.tie(0);
int length;
cin >> length;
int num;
cin >> num;
vector<int> location;
for(int i = 0; i < num; i++){
int n;
cin >> n;
location.push_back(n);
}
int start = 1,end = length;
int answer = 0;
while (start <= end) {
int mid = (start + end) / 2;
bool can_light = true;
// 왼쪽 끝 확인
if (location[0] - mid > 0) can_light = false;
// 중간 구간 확인
for (int i = 0; i < num - 1; i++) {
if (location[i+1] - location[i] > 2 * mid) {
can_light = false;
break;
}
}
// 오른쪽 끝 확인
if (location.back() + mid < length) can_light = false;
if (can_light) {
answer = mid;
end = mid - 1;
} else {
start = mid + 1;
}
}
cout << answer;
}