import sys
input = sys.stdin.readline
N, C = map(int, input().split())
house = []
for _ in range(N):
house.append(int(input()))
house.sort()
# print(house)
start = 1
end = house[-1] - house[0]
while start <= end:
mid = (start + end) // 2
curPo = house[0]
count = 1
# start 와 end 는 curPo + mid +1
if C == 2: # 개수 2 일 때는 처음, 끝 노드에 존재
print(end) # 최대거리 = end
exit(0)
else: # C >= 3
for i in range(1, len(house)):
if house[i] > curPo + mid: # 다음 공유기 위치 = (curPo + mid+1) 이상
curPo = house[i] # 공유기 설치 위치
count += 1 # 공유기 개수 증가
if count >= C: # 설치개수 > C -> mid 증가 -> 설치개수 ↓
start = mid + 1
else: # 설치개수 < C -> mid 감소 -> 설치개수 ↑
end = mid - 1
print(start) # 최대 mid 일때 좌표간 사이거리는 start = mid + 1 이므로
start
와 end
는 좌표( 공유기 )간 최소거리, 좌표간 최대 거리
mid
는 공유기와 공유기 사이의 거리를 의미한다.
그렇기에 start = mid +1
, end = mid + 1
관계가 될 수 있다.
curPo
는 최근에 공유기가 설치된 위치
C == 2
라면 처음과 끝에 공유기가 설치된 end 일때가 출력되고
C >= 3
이라면 처음 부터 mid+1
만큼 떨어진 위치에 공유기를 설치해 나아간다.
count < C
: 차이거리 mid
줄이려고 end = mid -1
count > C
: 차이거리 mid
늘리려고 start = mid + 1
count == C
: start <= end
조건에 만족하는 mid
의 최댓값을 구하기 위해서 start = mid +1
로 다음 단계도 진행해본다. 만약 start <= end
조건에 만족하지 않으면 mid
가 최대일 때 start
의 값이 mid +1
이므로 답은 start
를 출력하게 된다.
이분탐색 너무 어려운 것 같다.
이문제에서는 start
와 end
의 개념은 전혀 생각하지 못했다.
count == C
일 때를 잘 생각해볼 수 있으면 좋겠다.* if count >= C:
start = mid + 1
start <= end
도 꼭 기억 !!두가지 자꾸 풀 때마다 고민하는 것 같다