https://www.acmicpc.net/problem/2512
문제
여러 지방 N개의 예산 요청을 받고, 국가 예산의 총액 이하로 예상을 배정합니다.
- 모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정합니다.
ex. [10, 10, 10, 20] 의 예산을 요청 받았고, 총 금액이 50이라면 국가 예산 총액에서 요청한 금액들을 모두 배정할 수 있습니다.
즉, [10, 10, 10, 20] 예산 그대로 배정됩니다. - 모든 요청이 배정될 수 없는 경우에는 특정한 정수 상한액을 계산하여 그 이상의 예산 요청에는 모두 상한액을 배정합니다. 상한액 이하의 예산 요청에 대해서는 요청한 금액을 그대로 배정합니다.
ex. [110, 120, 140, 150]의 예산을 요청 받았고, 총 금액이 485인 경우에
상한액을 127로 잡으면 [110, 120, 127, 127]의 예산이 배정됩니다.
출력
배정된 예산들 중 최댓값인 정수를 출력합니다.
풀이
from sys import stdin
input = stdin.readline
N = int(input())
# 요청한 예산
prices = list(map(int, input().split()))
# 국가 예산의 총액
total = int(input())
# 국가 예산의 총액으로 배정가능할 경우 최댓값을 출력합니다.
if sum(prices) <= total:
print(max(prices))
else:
start, end = 0, max(prices)
while start <= end:
# 중앙값을 가져옵니다.
mid = (start + end) // 2
# 현재의 중앙값을 상한액으로 보았을 때, 총합을 계산합니다.
result = 0
for i in prices:
if i > mid:
# 상한액 이상의 예산요청에는 모두 상한액을 배정한다.
result += mid
else:
# 상한액 이하의 예산요청에 대해서는 요청한 금액을 그대로 배정한다.
result += i
# 국가 예산 이하인 경우
if result <= total:
start = mid + 1
# 국가 예산에 초과인 경우, 상한액을 내립니다.
else:
end = mid - 1
print(end)
'알고리즘 공부 > 이진 탐색' 카테고리의 다른 글
[백준/이진탐색] 2110번 공유기 설치 (0) | 2024.06.21 |
---|