백준 - [2110] 공유기 설치

Dean_Kang·2021년 8월 6일
0

백준

목록 보기
19/36
post-thumbnail

문제

도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x1, ..., xN이고, 집 여러개가 같은 좌표를 가지는 일은 없다.

도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.

C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.

코드

a, b = map(int, input().split())
houses = list()

for i in range(a):
    houses.append(int(input()))


def calc(distance, house):
    j = 1
    count = 1
    start = house[0]
    while j < len(house):
        if house[j] - start >= distance:
            count += 1
            start = house[j]
        j += 1

    return count


houses.sort()
left = 1
right = houses[-1] - houses[0]
cnt = 1
ans = 0
while left <= right:
    mid = (left + right) // 2  # 인접한 공유들의 최대 거리
    res = calc(mid, houses)

    if res < b:
        right = mid - 1
    elif res >= b:
        ans = max(ans, mid)
        left = mid + 1

print(ans)

설명

이분탐색으로 푸는 문제인데 문제는 이분탐색의 기준을 무엇으로 정하느냐였다. 입력을 모두 받고 정렬을 오름차순으로 한다음에 이분탐색의 기준(left, right)을 공유기 사이의 간격으로 잡았다. 즉 최소값은 1, 최대값은 주어진 집들의 좌표 중 최소와 최대의 차가 최대값이라고 가정한후 진행하였다.

profile
for the goal

0개의 댓글