반응형
예산
티어 : Silver 3
시간 제한 : 1 초
메모리 제한 : 128 MB
알고리즘 분류 : 이분 탐색, 매개 변수 탐색
문제
국가의 역할 중 하나는 여러 지방의 예산요청을 심사하여 국가의 예산을 분배하는 것이다. 국가예산의 총액은 미리 정해져 있어서 모든 예산요청을 배정해 주기는 어려울 수도 있다. 그래서 정해진 총액 이하에서 가능한 한 최대의 총 예산을 다음과 같은 방법으로 배정한다.
1. 모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정한다.
2. 모든 요청이 배정될 수 없는 경우에는 특정한 정수 상한액을 계산하여 그 이상인 예산요청에는 모두 상한액을 배정한다. 상한액 이하의 예산요청에 대해서는 요청한 금액을 그대로 배정한다.
예를 들어, 전체 국가예산이 485이고 4개 지방의 예산요청이 각각 120, 110, 140, 150이라고 하자. 이 경우, 상한액을 127로 잡으면, 위의 요청들에 대해서 각각 120, 110, 127, 127을 배정하고 그 합이 484로 가능한 최대가 된다.
여러 지방의 예산요청과 국가예산의 총액이 주어졌을 때, 위의 조건을 모두 만족하도록 예산을 배정하는 프로그램을 작성하시오.
입력
첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상 100,000 이하이다. 그 다음 줄에는 총 예산을 나타내는 정수 M이 주어진다. M은 N 이상 1,000,000,000 이하이다.
출력
첫째 줄에는 배정된 예산들 중 최댓값인 정수를 출력한다.
예제 입출력
Algorithm
1. 이진탐색 - 재귀 이용
2. mid를 상한으로 했을 때 요청되는 예산이 합이 총 예산보다 작으면 answer를 최댓값으로 갱신
Code
import sys
input = sys.stdin.readline
# 이진탐색 함수
def binary_search(start, end):
global answer
# 찾는 값이 없으면 None 반환
if start > end:
return None
mid = (start + end) // 2
# mid index의 값으로 상한값을 정했을 때 전체 예산 계산
total = 0
for i in request:
# 요청 금액이 상한값보다 크면 상한값으로 요청
if mid < i:
total += mid
# 그 외의 상황은 요청 금액 그대로 요청
else:
total += i
# mid index의 값으로 상한값을 정했을 때 전체 예산 넘어가면 상한값을 낮춰야함
if total > budget:
return binary_search(start, mid - 1)
else: # 그 외의 상황에서는 상한값의 최댓값 찾기
if mid > answer:
answer = mid
return binary_search(mid + 1, end)
# 입력
_ = int(input())
request = list(map(int, input().split()))
budget = int(input())
answer = 0
binary_search(0, max(request))
print(answer)
메모리: 30864 KB
시간: 76 ms
반응형
'백준 > Python' 카테고리의 다른 글
[백준 1654] 랜선 자르기 Python (0) | 2022.03.08 |
---|---|
[백준 7795] 먹을 것인가 먹힐 것인가 Python (0) | 2022.03.08 |
[백준 2776] 암기왕 Python (1) | 2022.03.08 |
[백준 1920] 수 찾기 Python (0) | 2022.03.08 |
[백준 10828] 스택 Python (0) | 2022.03.06 |