S사
에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.
물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원
을 신청한 부서에는 정확히 1,000원
을 지원해야 하며, 1,000원
보다 적은 금액을 지원해 줄 수는 없습니다.
부서별로 신청한 금액이 들어있는 배열 d
와 예산 budget
이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return
하도록 solution
함수를 완성해주세요.
d
는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)
는 1 이상 100 이하
입니다.d
의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액
은 1 이상 100,000 이하
의 자연수입니다.budget
은 예산을 나타내며, 1 이상 10,000,000 이하
의 자연수입니다.d | budget | result |
---|---|---|
[1,3,2,5,4] | 9 | 3 |
[2,2,3,3] | 10 | 4 |
입출력 예 #1
각 부서에서 [1원, 3원, 2원, 5원, 4원]
만큼의 금액을 신청했습니다. 만약에, 1원, 2원, 4원
을 신청한 부서의 물품을 구매해주면 예산 9원
에서 7원
이 소비되어 2원
이 남습니다. 항상 정확히 신청한 금액만큼 지원해 줘야 하므로 남은 2원
으로 나머지 부서를 지원해 주지 않습니다. 위 방법 외에 3개
부서를 지원해 줄 방법들은 다음과 같습니다.
1원, 2원, 3원
을 신청한 부서의 물품을 구매해주려면 6원
이 필요합니다.1원, 2원, 5원
을 신청한 부서의 물품을 구매해주려면 8원
이 필요합니다.1원, 3원, 4원
을 신청한 부서의 물품을 구매해주려면 8원
이 필요합니다.1원, 3원, 5원
을 신청한 부서의 물품을 구매해주려면 9원
이 필요합니다.3개
부서보다 더 많은 부서의 물품을 구매해 줄 수는 없으므로 최대 3개
부서의 물품을 구매해 줄 수 있습니다.입출력 예 #2
모든 부서의 물품을 구매해주면 10원
이 됩니다. 따라서 최대 4개
부서의 물품을 구매해 줄 수 있습니다.
d
는 부서별 신청한 금액이고, budget
은 예산이다.
만약 d
가 [1,5,6,3,2]
이고 budget
이 6
이라면 경우의 수는
1,5 - 2개
6 - 1개
1,3,2 - 3개
가 된다. 여기서, 그리고 입출력 예 에서 최소의 수를 먼저 계산한다는 사실을 알 수 있었다.
이에 d
를 오름차순 정렬을 하였다. import java.util.Arrays;
에 있는 Arrays.sort()
를 사용할 수도 있었지만 알고리즘 테스트를 위해 for문
으로 정렬을 하였다.
이제 d
의 최소의 수가 앞쪽에 정렬이 되었다. [0]
부터 차근차근 하나씩 더해본 뒤 만약 sum
이 budget
보다 크다면 break
로 for문
을 빠져나왔고,
sum
이 아직 budget
보다 크지 않다면 if문
뒤의 cnt
를 증가시켜 물품을 지원할 수 있는 부서의 개수를 1
증가시켰다.
후에 물품 지원이 가능한 부서의 개수인 cnt
를 return
해주었다.
import java.util.Arrays;
class Solution {
public int solution(int[] d, int budget) {
// 정렬
//Arrays.sort(d);
for ( int i = 0; i < d.length; i++) {
for ( int j = 1; j < d.length-i; j++) {
if (d[j-1] > d[j]) {
int tmp = d[j-1];
d[j-1] = d[j];
d[j] = tmp;
}
}
}
int sum = 0, cnt = 0;
for ( int i = 0; i < d.length; i++) {
sum += d[i];
if ( sum > budget ) break;
cnt++;
}
return cnt;
}
}