도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x1, ..., xN이고, 집 여러개가 같은 좌표를 가지는 일은 없다.
도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.
C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.
5 3
1
2
8
4
9
3
N, C = map(int, input().split()) # 집, 공유기
houses = list(int(input()) for _ in range(N)) # 집 좌표
houses.sort() # 정렬
lt = 1 # 집 사이의 최소 거리
rt = houses[-1] - houses[0] # 집 사이의 최대거리(양 끝 집 거리)
rst = rt # 결과값. 최대값으로 초기화
while lt <= rt: # 이분탐색
mid = (rt + lt) // 2
cnt = 1 # 집들 사이 최소거리가 mid일 때의 공유기 개수 초기화
start = houses[0] # 집 사이의 거리를 재기 위한 출발 집 좌표.
for i in range(1, N): # 공유기 개수 셈
distance = houses[i] - start # 집 사이의 거리
if mid <= distance: # 집 사이의 거리가 mid 이상이면 다음 공유기 설치
cnt += 1
start = houses[i] # 다음 집과의 거리를 구하기 위한 집 좌표 변경
if cnt < C: # 설치한 공유기 개수가 C 미만이면 거리를 줄임
rt = mid - 1
else: # 설치한 공유기 개수가 C 이상이면 거리를 늘림
rst = mid # 결과값 저장
lt = mid + 1
print(rst)
이분탐색 문제이다. 기준을 가장 인접한 공유기 사이의 거리(distance)로 잡고, 이분탐색을 한 번 할 때 마다 이 길이로 공유기를 설치하면 공유기의 개수가 C가 되는지 확인한다.
공유기의 개수가 C가 된다면 distance가 최대가 되도록 이분탐색을 계속 진행한다.