[BOJ] 2110 공유기 설치

이분 탐색


해당 문제는 이분 탐색을 이용하여 구현할 수 있는 문제이다. 입력만 작았다면 완전 탐색으로도 구현이 가능한 문제이다.

접근법

  • 10억이라는 입력은 너무 크기 때문에 로그 스케일을 적용할 방법을 찾는다. 최소 몇 칸씩 건너뛰면 되는 지를 이진 탐색을 사용하여 구한다. 10억 → 5억 → 2.5억 과 같이 줄여 나간다.
  • 만약 공유기를 설치할 수 있거나 남는다면 다시 범위를 늘려서 탐색한다.
  • 집은 순차탐색하며 앞서 구한 거리에 따라 공유기를 직접 설치 해본다 (count_c 함수)

이렇게 한다면 O(N * log2(10억))이 된다. → 가능

import sys

def count_c(mid, n):
    prev = houses[0]
    count = 1
    for h in range(1, n):
        if houses[h] >= prev + mid:
            count += 1
            prev = houses[h]
    return count

def binary_search(start, end, c, n):
    answer = 0
    while start <= end:
        mid = (start + end) // 2
        if count_c(mid, n) >= c:
            start = mid + 1
            answer = mid
        else:
            end = mid - 1
    print(answer)

if __name__ == "__main__":
    N, C = map(int, sys.stdin.readline().rstrip().split())
    houses = list()
    for i in range(N):
        houses.append(int(sys.stdin.readline().rstrip()))
    houses.sort()
    binary_search(0, max(houses), C, N)