[자바스크립트] 프로그래머스 레벨 1 - 내적 해석 및 답안
문제
길이가 같은 두 일차원 배열 a,b가 주어진다.
두 배열의 내적을 구하는 문제이다.
내적은 a[0]*b[0] + a[1]*b[1] + ... a[n-1]*b[n-1] (n은 배열의 길이) 형태로 계산된다.
각 배열의 값들을 하나씩 꺼내서 각 수를 곱한 뒤 총합을 구해주면 된다.
제한사항
a,b의 범위를 나타내는데 코딩에서 딱히 신경 쓸 점은 없었다.
답
이 문제를 풀기 위해 filter()라는 함수를 썼다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
filter함수는 배열의 각 값들을 비교한 뒤 조건에 맞는 값만 뽑아오는 데 필요한 함수이다.
사이트를 참조해보면 알겠지만 Filter함수는 현재의 값과 인덱스, 그리고 현재 배열까지 총 3개의 파라미터를 받는다.
나는 현재의 값을 나타내는 첫번째 파라미터와 현재의 인덱스를 나타내는 두번째 파라미터를 사용했다.
첫번째 값은 각 값들을 곱해줘야 하기 때문에 사용했고 두번째는 a배열의 i번째 값과 곱해줄 b배열의 i번째 값을 찾기 위해서 사용했다.
function solution(a, b) {
var answer = 0;
a.filter((val, i) => {
answer += val * b[i];
})
return answer;
}
그 결과 이런 식으로 a 배열에 filter함수를 사용하여 answer라는 변수의 값에 각 값들을 곱한 총 합을 담아주었다.
다른 사람의 풀이
가장 많은 사람들이 생각할 법한 것은 역시 for문을 사용하는 것이다.
하지만 최대한 여러 함수를 사용해보자는 생각에 filter함수를 사용했고 그 외에 reduce함수를 이용해도 된다는 사실을 알았다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
reduce함수는 총 4개의 인자를 받는다.
1.누적된 값
2.현재 값
3.현재 인덱스
4.원본 배열
filter함수와 비슷하면서도 다른데 그 중 가장 큰 것은 첫번째인 누적된 값을 반환한다는 것이다. 그래서 이것을 이용하여 곱한 값의 총합을 구할 수 있다.
a.reduce((acc, _, i) => acc += a[i] * b[i], 0);
acc는 누적된 값, 2번째는 사용하지 않는 인자이고 i는 인덱스이다. acc에 배열의 각 값을 곱한 값을 합해주는 것이다. 마지막 0은 acc의 초기값을 설정한 것이라고 보면된다.