행복을 담는 블로그
[TIL / 프로그래머스] 240125(목) 내적 / array.reduce( ) - currentIndex 사용하기 본문
이 문제를 보고 나는 바로 아 그냥 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개이다.
-
- 누산기 (acc)
-
- 현재 값 (cur)
-
- 현재 인덱스 (idx)
-
- 원본 배열 (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 메소드를 잘 사용할 수 있었으면 좋곘다~~
'TIL' 카테고리의 다른 글
[TIL] 240129(월) id 값 반복 피하기 / 카드 정렬하기 (2) | 2024.01.30 |
---|---|
[TIL] 240126(금) 개인과제 README 작성 / Code Refactoring 하기 (3) | 2024.01.26 |
[TIL] 240124(수) React 숙련주차 시작 / map( ), filter( ) 메소드 복습 (0) | 2024.01.24 |
[TIL] 240123(화) React 입문 개인과제 : To-do list 만들기(3) / 컴포넌트 분리하기 (1) | 2024.01.24 |
[TIL] 240123(화) React 입문 개인과제 : To-do list 만들기(2) / Todo 완료/취소하기 (0) | 2024.01.24 |