본문 바로가기
문제 풀이/백준(BOJ)

[Python] 백준 2110번 : 공유기 설치

by 희조당 2022. 7. 26.
728x90

https://www.acmicpc.net/problem/2110

 

2110번: 공유기 설치

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

www.acmicpc.net


💡 문제 풀이

이분 탐색 문제이다.

 

입력받은 집의 위치를 정렬해서 이분 탐색을 진행한다.

이분 탐색 시 mid는 공유기 사이의 거리를 의미한다.

따라서 최소거리는 1, 최대 거리는 마지막 집과 처음 집의 간격이다.

지금 설치하려는 위치가 확인하는 간격(mid)을 벗어나는지 확인하면서 설치한 공유기 개수를 세어준다.

설치한 개수가 c보다 크다면 간격을 더 늘려도 된다는 소리이고, 반대로 작다면 간격을 줄여야 한다.

✔️ 느낀 점

크게 어렵지 않은 문제이다. 다만 이번에 sort()와 sorted()의 차이를 놓쳐서 계속 틀렸다고 나왔다.. ㅂㄷㅂㄷ

💻 코드

import sys
input = sys.stdin.readline

n, c = map(int, input().split())
home = [int(input()) for _ in range(n)]
home.sort()

left, right = 1, home[-1] - home[0]

while left <= right:
    mid = (left + right) // 2
    router = home[0]
    cnt = 1
    
    for i in range(1, n):
        if home[i] >= router + mid:
            router = home[i]
            cnt += 1
            
    if cnt < c: right = mid - 1
    else: 
        left = mid + 1
        ans = mid
    
print(ans)

댓글