JAVASCRIPT/코딩테스트

[자바스크립트] 프로그래머스 레벨 1 - 내적 해석 및 답안

진짠 2023. 3. 4. 22:52
728x90
문제

길이가 같은 두 일차원 배열 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

 

Array.prototype.filter() - JavaScript | MDN

filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.

developer.mozilla.org

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

 

Array.prototype.reduce() - JavaScript | MDN

reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.

developer.mozilla.org

 

reduce함수는 총 4개의 인자를 받는다.

 

1.누적된 값

2.현재 값

3.현재 인덱스

4.원본 배열

 

filter함수와 비슷하면서도 다른데 그 중 가장 큰 것은 첫번째인 누적된 값을 반환한다는 것이다. 그래서 이것을 이용하여 곱한 값의 총합을 구할 수 있다.

 

a.reduce((acc, _, i) => acc += a[i] * b[i], 0);

acc는 누적된 값, 2번째는 사용하지 않는 인자이고 i는 인덱스이다. acc에 배열의 각 값을 곱한 값을 합해주는 것이다. 마지막 0은 acc의 초기값을 설정한 것이라고 보면된다.

728x90