예산 - lv.3
문제
국가의 역할 중 하나는 여러 지방의 예산요청을 심사하여 국가의 예산을 분배하는 것입니다. 국가예산의 총액은 미리 정해져 있어서 모든 예산요청을 배정해 주기는 어려울 수도 있습니다. 그래서 정해진 총액 이하에서 가능한 한 최대의 총 예산을 다음과 같은 방법으로 배정합니다.
1
2
3
| 1. 모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정합니다.
2. 모든 요청이 배정될 수 없는 경우에는 특정한 정수 상한액을 계산하여 그 이상인 예산요청에는 모두 상한액을 배정합니다.
상한액 이하의 예산요청에 대해서는 요청한 금액을 그대로 배정합니다.
|
예를 들어, 전체 국가예산이 485이고 4개 지방의 예산요청이 각각 120, 110, 140, 150일 때, 상한액을 127로 잡으면 위의 요청들에 대해서 각각 120, 110, 127, 127을 배정하고 그 합이 484로 가능한 최대가 됩니다. 각 지방에서 요청하는 예산이 담긴 배열 budgets과 총 예산 M이 매개변수로 주어질 때, 위의 조건을 모두 만족하는 상한액을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 지방의 수는 3 이상 100,000 이하인 자연수입니다.
- 각 지방에서 요청하는 예산은 1 이상 100,000 이하인 자연수입니다.
- 총 예산은 지방의 수 이상 1,000,000,000 이하인 자연수입니다.
입출력 예
budgets | M | return |
---|
[120, 110, 140, 150] | 485 | 127 |
풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| int solution(vector<int> budgets, int M) {
int answer = 0, maxSum = 0;
int min = 0, middle = 0;
int max = *max_element(budgets.begin(), budgets.end());
// Binary Search 기반
while(min <= max){
middle = (max + min) >> 1;
int sum = 0;
// 각 지방의 예산의 합 계산
for(auto &i : budgets){
// 지방의 요청예산보다 중간값이 클경우 지방의 요청예산을 반영
if(i <= middle){
sum += i;
}
// 지방의 요청예산보다 중간값이 작을시 중간값을 반영
else{
sum += middle;
}
}
// 지방의 예산 합보다 국가예산이 작은 액수중 가장 큰값을 계산
if(sum < M && maxSum < sum){
maxSum = sum;
answer = middle;
}
// Binary Search 의 종료조건
if(min == middle && middle == max){
break;
}
if(sum <= M){
min = middle + 1;
}
else{
max = middle - 1;
}
}
return answer;
}
|