[백준/Python]2512_예산
2021. 6. 10. 13:37ㆍ백준 알고리즘
문제
https://www.acmicpc.net/problem/2512
2512번: 예산
첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상
www.acmicpc.net
풀이
이분 탐색을 이용하여 풉니다.
n개의 예산 요청액들을 moneys 리스트에 저장하고 이분 탐색의 탐색 범위는 0부터 max(moneys)까지 입니다.
이분 탐색 반복문을 돌면서 총 예산 합(result)이 최대 예산(m)을 넘지 않으면서 가장 큰 값이 될 때의 최대 상한액(limit)을 구합니다.
코드
import sys
def binary_search(left, right):
result = 0 # 총 예산 합
limit = 0 # 최대 상한액
while left <= right:
mid = (left + right) // 2
total = 0
for money in moneys:
if money > mid:
total += mid
continue
total += money
if total <= m:
if result <= total:
result = total
limit = mid
left = mid + 1
continue
if total > m:
right = mid - 1
return limit
n = int(sys.stdin.readline().rstrip())
moneys = list(map(int, sys.stdin.readline().rstrip().split()))
m = int(sys.stdin.readline().rstrip())
print(binary_search(0, max(moneys)))
'백준 알고리즘' 카테고리의 다른 글
[백준/Python]1057_토너먼트 (0) | 2021.06.13 |
---|---|
[백준/Python]1620_나는야 포켓몬 마스터 이다솜 (0) | 2021.06.10 |
[백준/Python]2206_벽 부수고 이동하기 (0) | 2021.06.08 |
[백준/Python]9613_GCD 합 (0) | 2021.06.08 |
[백준/Python]1890_점프 (0) | 2021.06.07 |