본문 바로가기
개발 기초 다지기

내일배움캠프 29일차알고리즘 문제 : 내적 (reduce 함수에 대한 이해)

by 너의고래 2024. 5. 27.
반응형

문제 : 내적

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

 

제한사항

  • a, b의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.

 

입출력 예

a b result
[1,2,3,4] [-3,-1,0,2] 3
[-1,0,1] [1,0,-1] -2

 

입출력 예 설명

입출력 예 #1

  • a와 b의 내적은 1*(-3) + 2*(-1) + 3*0 + 4*2 = 3 입니다.

입출력 예 #2

  • a b 내적은 (-1)*1 + 0*0 + 1*(-1) = -2 입니다.

- 내가 푼 풀이

function solution(a, b) {
    var answer = 0;
    for(let i=0; i < a.length; i++){
        answer += a[i]*b[i];
    }
    
    return answer;
}

 

두 배열의 같은 인덱스의 숫자들끼리 곱해준 후 모두 더해주면 되는 문제.

for문을 사용해 i에 차례대로 접근하여 각 수를 곱해준 후 answer에 더해주었다.

 

- 다른 풀이

function solution(a, b) {
    return a.reduce((acc, _, i) => acc += a[i] * b[i], 0);
}
//사용하지 않는 인자일 경우, 인자에 _ 를 넣음


//같은건가?
function solution(a, b) {
    var answer = a.reduce((acc, cur, idx) => acc += cur*b[idx], 0)
    return answer;
}

 

reduce함수를 이용한 풀이. 내가 reduce 함수를 완벽히 이해하지 못했는지 조금 정리가 필요했다.

둘 다 배열 a가 reduce 함수를 호출한 구조로, 위에는 current 인자 부분을 비워두고 직접 a값을 a[i]로 넣어주었으며, 아래는 따로 명시해주지 않고 cur 인자로 현 인덱스의 a 배열값을 넣어주었다.

 

그리고 여기서부터가 문제였다.

왜 기본형인 '+'가 아니라 '+='를 사용한걸까?

우선 numbers.reduce((acc, cur) => acc + cur) 형태의 기본 누적합 계산의 경우 단순히 모든 배열의 합을 더할 때 사용한다고 한다.

 

그리고 '+'가 아닌 '+=' 형태를 사용한 경우는 누적 변수 acc에 값을 더 간결하게 추가할 때 사용한다고 한다.

위에서는  요소 cur 대응하는 b[idx] 곱한 값을 acc 추가하고 있어,  방식은 누적 계산을  직관적으로 표현할  있다고 한다.

 

 

결론

기본형(acc + cur) 사용하지 않은 이유는, 예제에서 cur * b[idx]라는 보다 복잡한 계산을 수행하기 때문이라고 한다.

acc = acc + cur * b[idx] 표현할 수도 있지만, += 사용하면 코드가  깔끔해진다고 하는데 이 설명으로 이해가 잘 가지 않았다.

 

지금 이걸 적으면서 내가 한 이해는 지금까지 사용해온 기본형의 경우 간단히 배열의 모든 숫자를 한 번에 더해도 되어서 따로 acc에 쌓아줄 필요가 없었는데,

이번같은 경우 각 인덱스 별로 끊어서 계산을 진행해줘야하기 때문에 acc에 쌓아야했고, 그래서 나온 식인 'acc = acc + cur * b[idx]'를 +=로 간결히 표현한 것이라는 결론.

 

별거 아니었는데, reduce 함수에 대한 완벽한 이해가 없었기에 괜히 생각을 많이 하게 만들었던 풀이였다.

시간을 많이 잡아먹긴 했지만 앞으로도 꼭 이해하고 넘어가는 습관을 들여 속이 알찬 개발자가 되어야겠다.

반응형

댓글