문제 이해하기
숫자 배열을 입력받아 인접한 두 요소씩 곱한 값을 차례대로 더하는 JavaScript 함수를 작성해야 합니다. 즉, 배열의 요소들을 두 개씩 묶어 곱셈을 수행한 뒤, 그 결과값들을 모두 합산하는 방식입니다.
예를 들어 다음과 같은 배열이 있다고 가정해 보겠습니다.
const arr = [1, 2, 3, 4, 5, 6, 7];
이 경우 결과값은 아래와 같은 방식으로 계산됩니다.
1*2 + 3*4 + 5*6 + 7
= 2 + 12 + 30 + 7
따라서 최종 출력값은 다음과 같습니다.
51
배열의 길이가 홀수일 때는 마지막 요소에 짝이 없으므로 해당 요소가 그대로 더해진다는 점에 유의하세요. 위 예제에서는 마지막 요소인 7이 단독으로 합산됩니다.
구현 방법
이 문제는 Array.prototype.reduce() 메서드를 활용하면 깔끔하게 해결할 수 있습니다. 크게 두 단계로 나누어 처리합니다.
첫 번째 단계에서는 짝수 인덱스의 요소와 바로 다음 요소를 곱한 값들을 새로운 배열에 담고, 두 번째 단계에서는 해당 배열의 모든 값을 합산하여 최종 결과를 반환합니다.
예제 코드
const arr = [1, 2, 3, 4, 5, 6, 7];
const alternateOperation = arr => {
const productArr = arr.reduce((acc, val, ind) => {
if(ind % 2 === 1){
return acc;
};
acc.push(val * (arr[ind + 1] || 1));
return acc;
}, []);
return productArr.reduce((acc, val) => acc + val);
};
console.log(alternateOperation(arr));
코드 설명
첫 번째 reduce는 배열을 순회하면서 홀수 인덱스(ind % 2 === 1)의 요소는 건너뛰고 짝수 인덱스의 요소만 처리합니다. 각 짝수 인덱스에서 현재 요소와 바로 다음 요소를 곱한 값을 누적 배열(acc)에 추가합니다.
여기서 arr[ind + 1] || 1 표현식이 중요한 역할을 합니다. 배열의 길이가 홀수여서 다음 요소가 존재하지 않으면(undefined) 1을 곱하게 되어, 마지막 요소가 값 그대로 유지된 채 합산에 포함됩니다.
마지막으로 두 번째 reduce는 곱셈 결과들이 담긴 배열의 모든 요소를 더해 최종 결과를 반환합니다.
출력 결과
코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
51