개발/코딩테스트

[프로그래머스 | JavaScript] 예산

prpn97 2023. 5. 1. 07:05

<문제 설명>

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다.
그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다.
그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

 

<문제 풀이>

function solution(d, budget) {
    d.sort((a, b) => a - b);
    while (d.reduce((a, b) => (a + b)) > budget) {
      d.pop();
    }
    return d.length;
}

먼저 오름차순으로 배열 d를 정렬한다. 

그리고 d의 요소를 reduce를 통해 전부 더해주고, 더해준 값이 budget보다 크면

while 반복문을 통해 계속해서 pop()을 하여 가장 끝 값을 지운다.

즉, 계속해서 지우다보면 budget보다 작아지게 될텐데,

budget보다 크면 종료한다는 것이다. 

 

이렇게 하게 되면, 정렬된 배열에서 모든 요소를 더한 뒤 요소의 가장 큰 값부터 제거해가며

각 요소를 더한 숫자 중 가장 작은 수를 반환하겠다는 것이다. 

 

1,2,3,4,5에서 9보다 큰 상태일 때까지 오른쪽에서부터 하나씩 지울 것이다. 

1,2,3,4,5를 더하면 15이니까 9보다 크기 때문에 5를 지운다. 

1,2,3,4를 더하면 10인데 여전히 9보다 크기 때문에 4를 지운다.

1,2,3을 더하면 6인데, 9보다 작다. 

여기서 반복문은 종료되고, 1,2,3의 길이인 3을 반환한다. 

 

<코멘트>

깔끔하게 풀었다고 생각하는데, 다른 풀이들을 찾아보니 내가 한 방식은 아무래도

내장함수 reduce와 pop을 계속해서 while로 돌리기 때문에 효율성이 떨어지는 것을 알게 되었다. 

조금 더 1차원적으로 푼 방식을 따로 알고리즘 카테고리에 포스팅해보겠다. 

728x90