N
: 현재 휴게소 개수 ()
M
: 더 지으려는 휴게소 개수 ()
L
: 고속도로 길이 ()
locations
: 현재 휴게소 위치 ()
M
개의 휴게소를 짓고 난 후 휴게소가 없는 구간의 최댓값의 최솟값을 출력하는 문제이다.
휴게소 위치들은 랜덤하게 입력되므로 탐색을 위해 먼저 오름차순 정렬해준다.
⭐️ 제약 조건
- 휴게소 세울 수 있는 위치
- 불가능
- 이미 휴게소 있는 곳 ❌
- 고속도로 끝 ❌
- 가능
- 정수 위치
- 모든 휴게소 위치 중복 ❌
휴게소가 없는 구간의 최댓값을 조절해가면서 원하는 최소가 되는 거리를 찾으면 될 것이다.
→ 이진 탐색 활용‼️
이진 탐색 구현
탐색 구간 = 1부터 L-1
까지 (휴게소 위치 범위에 따라)
start
= 1end
= L-1mid
= 휴게소 없는 구간의 최댓값탐색 수행
mid
만큼 떨어뜨려 휴게소 설치M
보다 작다 → mid
값 감소 (더 많이 세울 수 있도록)M
보다 크다 → mid
값 증가 (더 적게 세울 수 있도록)종료 조건
오름차순 정렬 →
이진탐색 →
최종 시간복잡도
L이 N보다 크므로 가 된다.
최악의 경우 이 되어 제한 시간 2초 내에 연산이 가능하다.
정렬 후 범위 내 이진탐색
cnt = (locations[i+1] - locations[i]) // mid
로 계산한 변수에서 NameError
가 발생했다.0
, L
미포함해 계산 시 누락 부분 발생cnt
와 M
을 비교해야하는데 mid
와 비교N-1
까지로 잘못 작성import sys
input = sys.stdin.readline
# N, M, L 입력
N, M, L = map(int, input().split())
# 휴게소 위치 입력
locations = [0] + list(map(int, input().split())) + [L]
# 위치 정렬
locations.sort()
# 이진 탐색 구간 정의
start = 1
end = L - 1
# 이진 탐색 구현
while start <= end:
# 휴게소 없는 구간의 최댓값 정의
mid = (start + end) // 2
# 설치한 휴게소 수 초기화
cnt = 0
# 휴게소 간 거리 계산해 지정한 최댓값보다 큰 값 확인
for i in range(len(locations)-1):
if locations[i+1] - locations[i] > mid:
# 휴게소 설치
cnt += (locations[i+1] - locations[i] - 1) // mid
# M과 설치한 휴게소 수 비교
if cnt <= M:
end = mid - 1
else:
start = mid + 1
# 결과 출력
print(start)