[알고리즘실수] reduce의 사용 실수 정리

김종현·2024년 11월 15일
0

알고리즘

목록 보기
5/8

문제

실수

코드 및 접근 방식

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 // 반드시 reduce는 반드시 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 값에 추가.
profile
고양이 릴스 매니아

0개의 댓글