문제 : 내적
길이가 같은 두 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 함수에 대한 완벽한 이해가 없었기에 괜히 생각을 많이 하게 만들었던 풀이였다.
시간을 많이 잡아먹긴 했지만 앞으로도 꼭 이해하고 넘어가는 습관을 들여 속이 알찬 개발자가 되어야겠다.
'개발 기초 다지기' 카테고리의 다른 글
ORM과 Prisma 그리고 model 만들기 (0) | 2024.05.29 |
---|---|
과제 ERD 작성과 SQL 제약조건 (0) | 2024.05.29 |
내일배움캠프 28일차 : SQL (Structured Query Language) (0) | 2024.05.25 |
내일배움캠프 27일차 : bcrypt 암호화 (0) | 2024.05.23 |
내일배움캠프 26일차 : 데이터베이스 정규화 (0) | 2024.05.22 |
댓글