본문 바로가기
Coding Test/JavaScript

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

by giem 2022. 8. 10.
반응형

프로그래머스 코딩 테스트 연습문제인 예산을 JavaScript로 풀어보겠다.

 

Python과 C++ 풀이는 아래 링크에서 확인해볼 수 있다.

2022.08.10 - [Coding Test/Python] - [프로그래머스] 예산 Python Code

2022.08.10 - [Coding Test/C++] - [프로그래머스] 예산 C++ Code


문제

 

예산 안에서 최대한 많은 부서에게 지원해주어야 하고,

몇 개의 부서에 물품이 지원이 되었는지 return 하면 된다.

 


구현 방법

이전 포스트와 같이 d를 오름차순으로 sorting 하고 돌며 budget에서 빼며 count 하고

budget이 0 미만이 되면 count 된 값을 return 하는 방식으로 구현했다.

 

Code
function solution(d, budget) {
    var answer = 0;

    d.sort((a, b) => a - b);

    for(var i = 0; i < d.length; i++) {
        budget -= d[i];
        if(budget < 0) break;
        answer++;
    }
    return answer;
}

평범하게 구현했다.

 


다른 사람의 풀이

다른 사람의 풀이는 어마어마한 게 많았다

우선 좋아요 1등의 풀이를 먼저 보겠다.

function solution(d, budget) {
    return ~(~d.sort((a,b)=>a-b).map(v => budget -= v).findIndex(v => v < 0) || ~d.length);
}

 

sort를 해서 d리스트의 각 값을 budget값으로 하고 빼는 것까지는 똑같다.

 

우선 map까지 보겠다.

만약에 budget이 9이고 d가 {1,2,3,4}라면

{8,6,3,-1}이 될 것이다.

그 후 findIndex를 통해 음수인 값의 인덱스를 찾으면 3이 된다(0부터 시작하므로)

이 값을 리턴해주는 것이다.

 

코드를 살짝 변형해서 살펴보자.

function solution(d, budget) {
    return (d.sort((a,b)=>a-b).map(v => budget -= v).findIndex(v => v < 0));
}

이렇게 해서 index까지는 찾을 수 있다.

하지만 모든 사람에게 나눠줄 수 있다면 음수 값을 찾을 수 없을 것이다.

이때 findIndex에서 -1을 반환하지만 || 연산에서는 -1을 참으로 보기에 ~연산을 취해서 바꿔주고

 

거짓이면 length를 반환하도록 한 뒤

그 값을 다시 복 구하기 위해서 가장 바깥쪽에 ~를 사용해서 리턴했다.

 


위의 방식이 복잡하다면

아래 코드와 같이 리턴 값이 -1일 때 d.length를 반환하도록 해도 성능 차이가 나지 않을 것이다.

function solution(d, budget) {
    let answer = d.sort((a,b)=>a-b).map(v => budget -= v).findIndex(v => v < 0);
    return answer==-1 ? d.length:answer
}

 

이렇게 프로그래머스 레벨 1 문제 예산을 C++, Python, JS로 모두 풀어보았다.

반응형

댓글