흰 스타렉스에서 내가 내리지

[BOJ] 2110번 공유기 설치 ★ 본문

Problem Solving

[BOJ] 2110번 공유기 설치 ★

주씨. 2022. 1. 2. 22:27
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

 

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

min_gap = 1
max_gap = arr[-1]-arr[0]
answer = 0
while min_gap <= max_gap:
    gap = (min_gap+max_gap)//2
    cnt = 1
    val = arr[0]
    
    for i in range(n):
        if arr[i] >= val+gap: 
            cnt += 1
            val = arr[i]
    
    if cnt >= c:    # c개 이상의 공유기를 설치할 수 있다
        min_gap = gap+1
        answer = gap
    else:            # c개 이상의 공유기는 설치할 수 없다
        max_gap = gap-1

print(answer)

이진 탐색으로 풀어야 할 문제라고는 생각했는데, 이진 탐색을 해야하는 주체가 집의 위치가 아니라 gap 변수일줄은 생각도 못했다.

비슷한 문제로 여기가 있다.

 

도출해내야 하는 답의 범위를 이진탐색의 주체로 하여, 계산 과정을 최소화하는 게 핵심이다.

'Problem Solving' 카테고리의 다른 글

[BOJ] 10825번 국영수  (0) 2022.01.02
[BOJ] 9663번 N-Queen  (0) 2022.01.02
[BOJ] 1715번 카드 정렬하기  (0) 2022.01.02
[BOJ] 1005번 ACM Craft  (0) 2022.01.02
[BOJ] 19236번 청소년 상어  (0) 2021.12.30