프로그래머스 코딩 테스트 연습문제인 예산을 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로 모두 풀어보았다.
'Coding Test > JavaScript' 카테고리의 다른 글
[프로그래머스] K번째수 JavaScript Code (4) | 2022.08.16 |
---|---|
[프로그래머스] 체육복 JavaScript Code (0) | 2022.08.10 |
[프로그래머스] 없는 숫자 더하기 JavaScript Code (2) | 2022.08.08 |
[프로그래머스] 소수 만들기 JavaScript Code (4) | 2022.08.04 |
[프로그래머스] 내적 JavaScript Code (0) | 2022.07.29 |
댓글