문제

실수
코드 및 접근 방식
function solution(arr, budget) {
const sorted = arr.sort( (a,b) => a-b)
return sorted.reduce( (acc, cur, i ) => {
return acc+cur <= budget ? acc+cur : acc
},0)
}
- 오름차순 정렬 후 reduce를 통해 도출한 금액 합계가 조건을 충족시킬 경우 index를 반환하고자 하였음.
문제 발생 이유
- 금액 합계가 조건을 충족시킨 뒤에도 reduce 함수 자체에서 다음 index로 연산을 시작하므로 index를 반환하여 답을 구하려는 접근은 잘못됨.
개선
코드 및 개선 방식
function solution(arr, budget) {
const sorted = [...arr].sort((a, b) => a - b);
return sorted.reduce((acc, cur, i) => {
if(acc.sum +cur <= budget){
acc.sum += cur
acc.count++
}
return acc
}, { sum : 0, count : 0}).count
}
- count값을 독립적으로 두어 조건을 충족시키는 경우에만 값을 올려 누계를 반환.
학습 사항 정리
1. 배열 메서드에서 조건을 따지는 경우 index 유의.
- 배열 메서드는 조건을 만족시킨다고 동작을 멈추는 것이 아니라 주어진 element의 숫자만큼 동작을 이어나가므로 index 값을 이용한 알고리즘 작성에 유의해야함.
2. reduce 함수는 acc를 반드시 반환해야 함.
- reduce 함수는 항상 이전 상태(acc)를 다음 순회로 전달해야 하므로 acc를 반환하는 것을 명심해야함.
다른 풀이 방식들
1. boolean 응용
function solution(d, budget) {
return d.sort((a, b) => a - b).reduce((count, price) => {
return count + ((budget -= price) >= 0);
}, 0);
}
- (budget -= price >= 0)의 조건은 boolean으로 0 또는 1을 반환한다. 이를 응용하여 예산이 budget 조건을 만족 시키는 조건을 0과 1로 반환하여 count 값에 추가.