행복을 담는 블로그

[TIL / 프로그래머스] 240125(목) 내적 / array.reduce( ) - currentIndex 사용하기 본문

TIL

[TIL / 프로그래머스] 240125(목) 내적 / array.reduce( ) - currentIndex 사용하기

hyun0zin 2024. 1. 25. 11:47

이 문제를 보고 나는 바로 아 그냥 for문으로 i를 ++ 하면서 더하면 되겠구나 라고 생각을 했다.

// 내가 처음 작성한 답
function solution(a, b) {
    let sum = 0
    for(let i=0; i<a.length; i++){
        sum += a[i]*b[i]
    }
    return sum;
}

근데 이 sum 부분을 작서하다가 뭔가 reduce 메소드가 생각은 났지만, for문을 돌고 있는 이 상황에서 어떻게 해결을 해야하는지 알지 못했다.

sum += a[i]*b[i]

// 이 sum 부분을 풀어서 쓰면 다음과 같다.
sum = sum + a[i]*b[i]

reduce 함수를 이용하여 이렇게 한 줄로 배열 내 값들의 합을 구할 수 있다.

// reduce 함수 이용
function solution(a, b) {
    const answer = a.reduce((acc, curr, currIdx)=> acc += curr * b[currIdx],0)

    return answer
}



reduce 함수에 대해서 조금 더 알아보도록 하자.

내가 원래 알고 있던 reduce() 메소드는 배열 내 숫자들의 합을 구하는 함수였다.
하지만 reduce () 에서 index도 넣어서 사용할 수 있다는 것을 알게 되었다.

 

1. reduce () 메서드로 배열의 합 구하기

(출처 어제 오늘 내일 )

let array = [1,2,3];

const result = array.reduce(function add(sum, curValue){
    return sum + curValue;
},0)

reduce() 함수의 parameter로 전달되는 callback 함수는 누적값(sum) 과 현재의 element(curValue)로 받는다.
이후 sum + curValue를 리턴하여 callback 함수의 누적값(sum)으로 전달된다.

 

초기값 설정

✅ initialValue(초기값) 설정 (optional)
: 초기값 설정은 필수는 아니지만, 초기값을 설정하지 않은 채로 빈 배열(ex) array =[];)이 전달 될 경우, error가 발생한다.

const arr = [ ];

const result = arr.reduce(function add(sum, currValue) {  
return sum + currValue;  
});

console.log(result); // ERROR

 

하지만 문제를 다 풀고 나서 다른 분들의 풀이를 보다가, reduce()로 idx를 사용할 수 있다는 것을 알게 되었다.
MDN 문서를 다시 살펴보면 다음과 같이 나온다.

📌 Array.prototyep.reduce()

  • reduce() method
    : 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환한다.
    즉, callback 함수의 일종이다.
arr.reduce(callback[, initialValue])

(자세한 내용은 여기서 확인)
Array.prototype.reduce()

 

즉, reducer 함수가 가질 수 있는 callback 함수의 인자는 4개이다.

    1. 누산기 (acc)
    1. 현재 값 (cur)
    1. 현재 인덱스 (idx)
    1. 원본 배열 (src)

리듀서 함수의 반환 값(return 되는 값)은 누산기(acc)에 할당된다. 누산기는 순회 중 계속 유지되므로 최종적으로 반환되는 값은 하나이다.


지금까지는 accumulator와 currentValue을 사용하여 배열의 합을 구하는 함수로 사용하였다.

const result = array.reduce(function add(accumulator, currValue) { 
    return accumulator + currValue; 
});



2. reduce () 메서드 - currentIndex 사용하기

하지만 여기에 3번째 인자인 currentIndex 까지 넣어서 사용할 수 있다.

배열이 하나만 주어질 경우, 앞에서부터 순차적으로 순회하면서 돌지만, index의 구분이 필요할 경우에는 currentIndex가 필요하다.

[0, 1, 2, 3, 4].reduce( function (accumulator, currentValue, currentIndex, array) { 
    return accumulator + currentValue; 
  }, 
);

아래 그림과 같이 배열이 순회함과 동시에 currentIndex 값이 함께 찍히는 것을 알 수 있다.
즉, index가 필요할 경우, 사용할 수 있다.

 

이제 reduce 메소드를 잘 사용할 수 있었으면 좋곘다~~