<프로그래머스, 예산 짜기>

Minwoong Kim·2022년 9월 25일
0

2022-Sep-25, today getting of my comfort zone.

본 내용은 오직 학습을 위해 작성되었으며, 추후 문제가 생길 시 즉시 삭제 조치하도록 하겠습니다.

문제 설명

S사에서는 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 한다.

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

단, 물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 한다.

접근 방식

물품을 구매할 때, 신청한 금액 모두를 지원해야하므로, 최대한 많은 부서의 물품을 구매하기 위해서는 신청한 금액이 적은 부서부터 차례대로 구매해주면 된다.

따라서, sort method로 작은 금액부터 나타내도록 주여진 배열 d를 정렬하자. 그리고, 작은 금액부터 차례대로 누산하여 그 값이 budget을 초과하는 때의 갯수를 return하도록 해보자.

Comfort zone

간단한 코드이다. newD 배열에 주어진 d 배열을 오름차순으로 정렬해 주고,

let newD = d.sort(function(a,b){
    return a-b;
    });

for 문을 사용하여 0으로 초기화되어 선언된 budgetCheck에 newD의 요소를 차례로 더해준다. 또한, 더해주는 연산이 수행되면 Counts 값이 1씩 증가되도록 한다.

만약, 더하기 연산이 수행된 후, budgetCheck가 주어진 budget 보다 커지면, 연산 전의 counts 값을 return 하도록 한다.

for(let i=0; i<newD.length; i++){
        if(budgetCheck<budget){
        budgetCheck +=  newD[i];
        counts++;
        }
        else {
            break;
        }
    }

Getting out of comfort zone

위의 방식과는 다르게, reduce를 사용해봤다. reduce에는 break가 작동하지 않아, 특정 조건의 범위를 벗어나면 연산을 하지 않도록 하는 알고리즘을 구현해야 했는데, 이를 '배열의 삭제'로 가능하게끔 해보았다.

reduce의 parameter인 acc를 초기값 0으로 하여, current 값 그러니까, d배열의 요소를 차례로 누산해가면서 그 값이 budget을 초과하는 순간, 그때의 index값을 return 하여 지원 가능한 부서의 수를 나타내도록 하였다.

또한, 모든 부서의 물품을 구매할 수 있는 경우에는 주어진 d 배열의 길이를 return 하도록 하였다.

Getting out of my comfort zone-2

개인적으로 가장 마음에 드는 코드이다. 가독성이 좋아졌을 뿐만 아니라, 조건절의 갯수도 하나 줄어들었다.
(sort와 forEach를 연결해서 쓴 것도 좀 멋있어 보이기도 하고...)

간단히 설명하자면, d 배열에 접근(.) 하여 오름차순으로 정렬하고, 또 그 정렬된 배열에 저근(.)하여 각 요소를 0으로 초기화된 budgetCheck에 더해주며, answer을 1 씩 증가시킨다. 만약 budget을 넘어가면, answer을 1씩 증가시키는 연산은 수행되지 않는다.

느낀점

앞으로도 계속 다양한 문법을 사용하여 다각도로 접근해봐야 겠다. 그러다 보면 언젠가 시의적절한 문법을 즉시 떠올릴 수 있겠지?

profile
Get out of my comfort zone

0개의 댓글