Programming/Questions

[백준/Python] 이진탐색 - 공유기 설치(2110)

당닝 2021. 8. 18. 02:59
728x90

 

공유기 설치


 

문제 설명

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

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

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


입력

첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가 한 줄에 하나씩 주어진다.


출력

첫째 줄에 가장 인접한 두 공유기 사이의 최대 거리를 출력한다.


입력 예시

5 3
1
2
8
4
9

출력 예시

3

 


나의 풀이

import sys

def binary_search(house, target, start, end):
    ans = 0

    # 이진 탐색 시작
    while start <= end:
        mid = (start + end) // 2 # 중간값 설정(공유기 사이 거리)

        # 첫번째 좌표부터 보며 공유기 간 거리가 mid일 때 공유기의 개수를 구함
        cnt = 1 # 공유기의 개수
        last = house[0]
        for h in house:
            if h - last >= mid:
                cnt += 1
                last = h

        if cnt >= target:
            start = mid + 1
            ans = max(ans, mid)
        else:
            end = mid - 1
    
    return ans

n, c = map(int, sys.stdin.readline().split())
house = [int(sys.stdin.readline()) for _ in range(n)]

house.sort()
print(binary_search(house, c, 1, house[n-1]-house[0]))

- 💡 아이디어
이진탐색으로 공유기 간 거리를 조절하며 그 때의 공유기의 개수가 c인지 찾도록 하였다.

[1, 2, 4, 8, 9]라면 공유기 간 거리는 1 ~ 8이 될 수 있다.

 

- 📚 후기

도저히 방법이 생각나지 않아 아이디어만 찾아보았다. 아이디어를 본 후 작성한 코드는 답과 거의 동일하다.

 

- ✏️ 배운점

     - arr[len(arr)-1]로 쓰던 걸 arr[-1]로 바꿔 쓰자.

     - 방법이 생각나지 않을 때는 원하는 값(결과값)을 조절하며 이진탐색하는 방법을 생각해보자.

728x90