diff --git "a/BOJ/\354\230\210\354\202\260/sumin.py" "b/BOJ/\354\230\210\354\202\260/sumin.py" new file mode 100644 index 00000000..4f7342ad --- /dev/null +++ "b/BOJ/\354\230\210\354\202\260/sumin.py" @@ -0,0 +1,47 @@ +""" +풀이시간 : 20분 + + +- n: 지방의 수(N은 3 이상 10,000) +- 지방의 예산요청을 표현하는 N개의 정수(값들은 모두 1 이상 100,000 이하) +- m: 총 예산(N 이상 1,000,000,000 이하) + + +1) 이분 탐색을 통해 정수 상한액을 찾는다. (최적의 상한액을 찾기 위해 범위를 좁혀나가기) +- 정수 상한액보다 더 많은 예산 요청을 한 경우 -> 해당 지방은 상한액을 배정한다. +- 정수 상한액 이하의 예산 요청을 한 경우 -> 해당 지방은 요청 금액을 배정한다. + +2) 각 지방에 모두 예산을 배정한 후 left 또는 right를 조정해 가능한 최대의 총 예산을 사용하는 방법을 찾는다. +- 배정한 예상의 총합이 총 예산보다 작거나 같면, left를 증가시켜 정수 상한액을 증가시킴으로써 배정할 예산의 총합을 더 키운다. +- 배정한 예상의 총합이 총 예사보다 크다면, right를 증가시켜 정수 상한액을 줄이고 배정할 예산의 총합도 줄여준다. + +3) 최종적으로 배정된 예산들 중 최댓값(정수 상한액)인 정수를 출력한다. + +<시간복잡도> +O(nlogn) +""" +import sys +input = sys.stdin.readline + + +n = int(input()) # 지방의 수 +cities = list(map(int, input().split())) # 각 지방의 예산 요청 금액 +budget = int(input()) # 총 예산 + + +left, right = 0, max(cities) +while left <= right: + mid = (left+right) // 2 # 정수 상한액 + tot = 0 # 배정한 예산의 총합 + for city in cities: + if city > mid: # 1) 상한액 이상의 예산 요청을 한 경우 + tot += mid # 상한액 배정 + else: # 2) 상한액 이하의 예산 요청을 한 경우 + tot += city # 요청한 금액 + if tot <= budget: # 배정한 예산의 총합이 총 예산보다 적다면 + left = mid + 1 # 정수 상한액을 증가시키기 -> 배정할 예산의 총합도 커짐 + else: # 배정한 예산의 총합이 총 예산보다 크다면 + right = mid - 1 # 정수 상한액을 줄이기 -> 배정할 예산의 총합도 줄어듬 + +# 배정된 예산들 중 최댓값인 정수 +print(right)