S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.
물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.
부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.입출력 예
function solution(d, budget) {
d.sort((a, b) => a - b);
var sum = 0;
var i = 0
for ( i; i<d.length; i++) {
if (sum + d[i] <= budget) {
sum += d[i];
}
else{
return i;
}
}
return i;
}
처음 생각엔 n = d.length 라고하면 n명중 n명에게 지원해주는 조합의 수,
n명중 n-1명에게 지원해주는 조합의수.... n명중 1명에게 지원해주는 조합의수를 차례대로 탐색하며
해당 차례의 조합의 수에서 총 지원금액들 중 예산금액보다 작거나 같은 금액이 한개의 경우라도 있으면
그 지원해주는 명수가 최대 지원가능 명수라고 생각했었는데 테스트 케이스 7번부터 런타임 에러가 나서 한참을 생각해도 다른 방법이 떠오르지 않아
다른분의 풀이를 참고하였다. 다른분의 풀이는 프로그래머스 다른사람 풀이를 참고하였다. 참고결과
배열을 오름차순으로 정렬하면 간단히 해결될 문제였다. 오름차순으로 정렬후 첫번째 인덱스부터 차례대로
더해주면 첫번째 인덱스의 합은 한명을 지원했을 때
지원금액의 최소값, 두번째인덱스까지 더했을 땐 두명을 지원했을 때 지원금액의 최소값이 된다.
결국은 각 구간의 합은 해당인원수 지원금액의 최솟값이므로
그 금액이 예산을 초과하지 않으면 그 인원은 지원 가능하게 되는 논리이다.
배열을 오름차순으로 정렬하면 배열의 각 요소의 합,곱,차의 최소값 최대값을 구하기 쉽다.
그리고, 어느 하나가 안되면 그 방법을 고집하지말고 다르게 생각해보는연습을 해봐야겠다.
될것같아도 이게 아닌경우도 있다. 빨리 포기하고 다른방법을 모색하는것도 실력이다.