S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.
물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.
부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.
d | budget | result |
---|---|---|
[1,3,2,5,4] | 9 | 3 |
[2,2,3,3] | 10 | 4 |
첫번째
내림차순 정렬 후 while문으로 reduce메서드를 반복한다. 각배열의 인덱스값을 더한 후 budget보다 클 시 pop 메서로 끝요소를 없앤 후 종료한다.
function solution(d, budget) {
d.sort((a, b) => a - b);
while (d.reduce((acc, nextVal) => acc + nextVal, 0) > budget) {
d.pop();
}
return d.length;
}
하지만 이 코드는 효율적이지 않다. 무려 반복시 마다 reduce로 반복하고 pop메서드 까지 해야하기 때문에 좋지 못한것 같다. for문으로 다시 풀어보자.
for문을 이용한 두번째 풀이
첫번째 코드에 비해 코드양은 늘어났지만 for of
와 조건문
을 통해 조금 더 효율적으로 코드를 짰다.
function solution(d, budget) {
let cnt = 0;
d.sort((a, b) => a - b);
for (let el of d) {
budget -= el;
if (budget < 0) {
break;
} else {
cnt++;
}
}
return cnt;
}