chae._.chae

[Algorithm] 백준 #2110 공유기 설치 본문

파이썬 알고리즘/BOJ

[Algorithm] 백준 #2110 공유기 설치

walbe0528 2023. 6. 25. 17:54
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

 

 

import sys
input = sys.stdin.readline

N, C = map(int, input().split())
position = [int(input()) for _ in range(N)]
position.sort()
# 가장 인접한 공유기 사이의 최대 거리 구하기
# 집 사이의 최소/최대 거리
start, end = 1, position[-1] - position[0]
result = 0

while start <= end:
    mid = (start + end) // 2
    cnt = 1  # 설치하는 공유기 갯수
    current = position[0]  # 마지막으로 설치된 공유기의 위치

    for i in range(1, N):
        if current + mid <= position[i]:  # 현재 집에서 다음 집까지의 거리가 mid 이상인 경우 -> 공유기 설치
            cnt += 1
            current = position[i]
    if cnt >= C:  # 지정한 갯수보다 현재 설치된 공유기 갯수가 많다면 -> 설치 간격을 넓힌다
        result = mid
        start = mid + 1
    else:  # 지정한 갯수보다 현재 설치된 공유기 갯수가 적다면 -> 설치 간격을 좁힌다
        end = mid - 1

print(result)

 

 

공유기를 설치할 거리를 이분탐색을 이용하여 결정한다.

이분탐색의 시작과 끝을 집 사이의 최소거리, 최대거리로 설정한다. 

 

예제로 주어진 집의 위치가 [1, 2, 8, 4 ,9]를 보면

start = 1, end = 8로 설정하고 mid = (1+8)//2 = 4 이다.

이 mid 값을 기준으로 공유기 설치 여부를 결정하게 되는데, (현재 집 ~ 다음 집)의 거리가 mid를 초과한다면 공유기를 설치한다. 

 

현재 mid=4이므로, 1과 8에 설치가능하다. 즉, 2개의 공유기만 설치가능하므로, mid의 값을 줄여가며 적당한 거리를 찾아나간다. 

728x90