


이 점들을 유념합시다

N, C = map(int, input().split())
# 집들의 좌표 저장
houses = []
for _ in range(N):
houses.append(int(input()))
# 좌표 정렬
houses.sort()
# 제일 인접한 거리가 n 이상이 되도록 c개를 설치 가능?
def can_build(n):
# 첫 집에는 무조건 설치
loc = houses[0]
total = 1 # 설치한 공유기 수
min_dist = float('inf') # 가장 인접한 두 공유기 간 위치
# 나머지 C - 1개 설치
for i in range(1, len(houses)):
if houses[i] - loc >= n:
total += 1
min_dist = min(min_dist, houses[i] - loc)
loc = houses[i]
# C개를 다 설치한 경우, 제일 인접한 거리 반환
if total == C:
return min_dist
# C개를 다 설치하지 못한 경우, 좁혀야 함
return False
can_build 함수를 만들어 봅시다
can_build 함수는 두 공유기 사이의 거리가 최소 n 이상이 되도록 하며, C개의 공유기를 설치할 수 있는지 반환합니다.n 이상인 집에만 설치합니다.min_dist 변수로 갱신합니다.houses.sort())C개를 모두 설치할 수 있으면, min_dist 값을 반환합니다.C개를 모두 설치하지 못한 경우, False를 반환합니다.for문으로 각 집을 1번씩 탐색하게 됩니다)left: 1 (양옆에 있는 집에 공유기가 설치된 경우)right: 맨 뒷 집 좌표 - 맨 앞 집 좌표 (맨 앞 집, 맨 두 집 2군데에만 설치된 경우)can_build 함수에 넣으면서 답을 찾습니다.can_build 함수에 넣다간 시간 초과가 뜹니다.
# 이분탐색
def binary_search():
left = 1
right = houses[-1] - houses[0] # 정렬했던거 기억하죠?
while left <= right:
n = (left + right) // 2
result = can_build(n)
# 설치 가능: 일단 설치하고, 더 넓힐 수 있나 확인
if result:
answer = result
left = result + 1
# 설치 부가능: 더 줄여야 함
else:
right = n - 1
return answer
can_build가 False가 아닌 경우, 가장 인접한 두 공유기 사이 거리인 result를 반환.result로 두었을 때, 모든 공유기를 설치 가능하단 소립니다. (이때 n <= result 입니다)result보다 거리를 더 늘려도, 설치가 가능할 수도 있잖아요.answer에 현재 result를 저장하고, left = result + 1로 설정해 result보다 더 큰 위치의 값을 찾아봅니다.can_build가 False인 경우,right = n - 1로 설정해, n보다 더 좁은 범위의 값을 찾아봅니다.import sys
input = sys.stdin.readline
N, C = map(int, input().split())
houses = []
for _ in range(N):
houses.append(int(input()))
houses.sort()
# 제일 인접한 거리가 n 이상이 되도록 c개를 설치 가능?
def can_build(n):
# 첫 집에는 무조건 설치
loc = houses[0]
total = 1 # 설치한 공유기 수
min_dist = float('inf') # 가장 인접한 두 공유기 간 위치
# 나머지 C - 1개 설치
for i in range(1, len(houses)):
if houses[i] - loc >= n:
total += 1
min_dist = min(min_dist, houses[i] - loc)
loc = houses[i]
# C개를 다 설치한 경우, 제일 인접한 거리 반환
if total == C:
return min_dist
# C개를 다 설치하지 못한 경우, 좁혀야 함
return False
# 이분탐색
def binary_search():
left = 1
right = max(houses) - min(houses)
while left <= right:
n = (left + right) // 2
result = can_build(n)
# 설치 가능: 일단 설치하고, 더 넓힐 수 있나 확인
if result:
answer = result
left = result + 1
# 설치 부가능: 더 줄여야 함
else:
right = n - 1
return answer
print(binary_search())
can_build 함수 실행