N이 최대 20만이므로 두 개씩 잡아가며 거리를 측정해서 수행하는 브루트포스로는 O(N^2)이므로 시간초과일게 뻔하다. 따라서 다른 방안을 선택해야 한다. 가장 간단한 방법은 거리를 미리 정해두고, 그 거리를 만족하는지 검증하는 로직으로 처리하는 것이다. 이는 파라메트릭 서치의 기본 유형이며 다음과 같은 조건을 만족하는지 체크하면 된다.
이 문제는 값을 만족하는지 체크하는 로직이 정적이며, 정답이 될 수 있는 ‘최대 거리’ 또한 연속된 자연수 중 하나이므로 파라메트릭 서치를 활용할 수 있다. 이렇게 되면 시간복잡도가 O(Nlog1e9)이므로 문제를 풀어낼 수 있다.
import sys
input = sys.stdin.readline
N, C = map(int, input().split())
li = []
ans = N - 1
for _ in range(N):
li.append(int(input()))
li.sort()
def can_go(dist):
cnt = C-1
prev = 0
for i in range(1, N):
if li[i] - li[prev] >= dist:
prev = i
cnt -= 1
if cnt == 0:
return True
return False
def ps():
global ans
left = 0
right = 10**18
while left <= right:
mid = (left + right) // 2
if can_go(mid):
ans = mid
left = mid + 1
else :
right = mid - 1
ps()
print(ans)