❓ 문제: 예산
S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다.
그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의
물품을 구매해 줄 수 있도록 하려고 합니다.
물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는
정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.
부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을
지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.
📝 문제 풀이
reduce 메서드로 풀까 map 메서드로 풀까 고민하다가
연산이 빠르고 보기 편한 for of 문으로 풀기로 했다.
// 처음 풀이
function solution(d, budget) {
let result = 0;
for(const amount of d.sort((a, b) => a - b)) {
if (budget < amount) break;
budget -= amount;
result++;
}
return result;
}
그런데 계속 내부적인 오류라고 잠시 후에 다시 해보라는 메세지가 떴다.
아무리 생각해도 무한 연산이 되는 부분은 없는 것 같은데...
심지어 기존 변수를 건드리면 안되는 건가 해서 복사본 변수를 만들어서 풀어봤지만 똑같았다.
그렇게 한 시간 남짓 계속 붙들고 있었다가...
질문하기 글 중에 budget이 0이 되면 반복문을 나오는 풀이가 있기에 한 번 적용해봤다
결과는 드디어 통과.....!!!!!!
// 수정한 풀이
function solution(d, budget) {
let result = 0;
for(const amount of d.sort((a, b) => a - b)) {
if (budget < amount || budget === 0) break;
budget -= amount;
result++;
}
return result;
}
그리고 다른 풀이를 구경해봤다.
// 다른 분의 풀이
function solution(d, budget) {
d.sort((a, b) => a - b)
while(d.reduce((a, b) => (a, b), 0) > budget) d.pop();
return d.length;
}
while의 조건문에 reduce 메서드를 넣는다니..!
역시 개발의 세계는 배움에 끝이 없어서 항상 새롭다.
다만 매번 메서드를 실행해야하는게 연산에 무리를 주지 않을까 해서 실행속도를 비교해봤다.
while문의 속도는 예상과 다르게 생각보다 빨랐다. 물론 케이스마다 편차가 좀 있었다.
while문도 개안네...
for of문이 2개가 된 건 테스트 통과가 된 후 처음 풀었던 풀이로 제출했더니 통과돼서...........
내부적인 오류가 있다매....ㅠㅠ
덕분에 if문의 조건의 개수에 따라 속도가 달라지는 것도 확인해보고 좋다....^^
그리고 드디어,
프로그래머스에서 등수가 1만대에 들어섰다!
이 순간을 얼마나 기다려왔는지...
누가 시킨 건 아니지만 13만대에서 시작해서
계속 성장해왔구나를 스스로 확인하는 지표이기에 너무 만족스럽다.
앞으로도 조금 느리다고 생각되도 꾸준하게 나아가자.
모두 즐코하세요-!
'코딩 생활 > 코딩테스트' 카테고리의 다른 글
[프로그래머스 | JS] 레벨 0. 가까운 1 찾기 (feat. mdn 사이트를 잘 살피자) (0) | 2023.04.25 |
---|---|
[프로그래머스 | JS] 레벨 0. 원소들의 곱과 합 (0) | 2023.04.24 |
[프로그래머스 | JS] 레벨 0. 특이한 정렬 (feat. sort()) (0) | 2023.04.14 |
[프로그래머스 | JS] 레벨 0. 중복된 문자 제거 (feat. Set 객체) (0) | 2023.04.12 |
[프로그래머스 | JS] 레벨 0. 점의 위치 구하기 (0) | 2023.03.10 |
댓글