728x90
https://www.acmicpc.net/problem/2512
2512번: 예산
첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상
www.acmicpc.net
이진 탐색으로 풀이가 가능하다
예산의 상한선을 구하는 문제다
예산의 상한선을 구하기 위해서는 총 예산의 최적의 합계가 필요하다.
이진 탐색의 중간값이 예산의 상한선이 되며
해당 상한선보다 예산이 큰 경우에는 상한선을 더하고
예산이 작거나 같은경우에는 해당 예산을 더한다
총 예산의 합이 지정된 예산값보다 작거나 같은 경우 상한선을 높이고
-> start값을 늘려줌
초과된 경우에는 상한선을 줄이는 방식을 반복해서 이어간다.
-> end값을 줄여줌
n = int(input())
array = list(map(int, input().split()))
budget =int(input())
array.sort()
start = 0
end = max(array) #국가의 예산보다 큰 예산은 배정되지않음
while start <= end:
sum = 0
mid = (start + end) // 2 # 이진탐색을 위한 중간값
for i in array: # 국가의 예산을 순회하면서 총합을 계산
if i <= mid: # 중간값보다 작거나 같은경우는 원래 예산을 더함
sum += i
else: # 중간값이 더 큰 경우에는 중간값을 더함
sum += mid
if sum <= budget: # 합산된 예산이 지정된 예산보다 같거나 작은 경우
start = mid +1 # start 예산보다 +1 한 예산으로 중간값 다시 계산
else: # 예산이 초과된 경우
end = mid - 1 # end 예산보다 -1 한 예산으로 중간값 다시 계산
print(end) # 가장 큰 값을 출력해야하므로 end 값 출력
728x90
반응형
'Coding Test' 카테고리의 다른 글
백준 16953 - A → B ( Python ) (0) | 2023.01.14 |
---|---|
백준 18352 - 특정 거리의 도시 찾기( Python ) (0) | 2023.01.12 |
백준 2805 - 나무 자르기( Python ) (0) | 2023.01.06 |
백준 1920 - 수찾기( Python ) (0) | 2023.01.04 |
백준 1463 - 1로 만들기( Python ) (0) | 2022.12.24 |