티스토리 뷰
📌문제
도현이의 집 N개가 수직선 위에 있다. 각각의 집 좌표는 x1, x2, x3...xN이고, 집 여러개가 같은 좌표를 가지는 일은 없다.
도현이는 언제 어디서나 와이파이를 즐기기 위해 집에 공유기 C개를 설치하려고 한다. 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게하여 설치하려고 한다.
C개의 공유기를 N개의 집에 적당히 설치해서 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.
📌풀이
이진 탐색으로 가장 인접한 두 공유기 사이의 거리를 조절해가며 매 순간 C보다 많은 개수로 공유기를 설치할 수 있는지 체크
C보다 많은 개수로 공유기를 설치할 수 있다면 가장 인접한 두 공유기 사이의 거리를 증가시켜서 더 큰 값에 대해서도 성립하는지 체크
📌코드
n, c = list(map(int, input().split(" ")))
# 전체 집의 좌표 정보를 입력받기
array = []
for _ in range(n):
array.append(int(input()))
array.sort() # 이진 탐색 수행을 위해 정렬
start = 1 # 가능한 최소 거리(min gap)
end = array[-1] - array[0] # 가능한 최대 거리(max gap)
result = 0
while start <= end:
mid = (start + end) // 2 # 가장 인접한 두 공유기 사이의 거리
value = array[0]
count = 1
# 현재 mid값을 이용해 공유기 설치
for i in range(1, n):
if array[i] >= value + mid:
value = array[i]
count += 1
if count >= c: # C개 이상 공유기를 설치할 수 있는 경우 거리 증가
start = mid + 1
result = mid
else: # 거리 감소
end = mid - 1
print(result)
📌참고