반응형

예산

티어 : 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

+ Recent posts