숫자 배열과 “odd”(홀수) 또는 “even”(짝수) 두 값 중 하나를 담은 문자열을 인자로 받아, 해당 조건에 일치하는 숫자들만 골라 합계를 구하는 함수를 만들어야 합니다. 만약 조건에 맞는 값이 하나도 없다면 0을 반환해야 합니다.
문제 예시
console.log(conditionalSum([1, 2, 3, 4, 5], "even")); => 6 console.log(conditionalSum([1, 2, 3, 4, 5], "odd")); => 9 console.log(conditionalSum([13, 88, 12, 44, 99], "even")); => 144 console.log(conditionalSum([], "odd")); => 0
위 예시를 살펴보면, [1, 2, 3, 4, 5] 배열에서 짝수는 2와 4이므로 합계가 6이 되고, 홀수는 1, 3, 5이므로 합계가 9가 됩니다. 세 번째 예시에서 짝수는 88, 12, 44의 합인 144이며, 마지막 예시처럼 빈 배열이 입력되면 조건에 맞는 요소가 없으므로 0을 반환합니다.
reduce() 메서드로 해결하기
그럼 이 함수의 코드를 작성해 보겠습니다. 여기서는 Array.prototype.reduce() 메서드를 활용합니다. reduce()는 배열의 각 요소를 순회하면서 누적값(accumulator)과 현재값(current value)에 대해 콜백 함수를 실행하고, 최종적으로 하나의 결과값을 반환하는 강력한 배열 메서드입니다.
예제 코드
const conditionalSum = (arr, condition) => {
const add = (num1, num2) => {
if(condition === 'even' && num2 % 2 === 0){
return num1 + num2;
}
if(condition === 'odd' && num2 % 2 === 1){
return num1 + num2;
};
return num1;
}
return arr.reduce((acc, val) => add(acc, val), 0);
}
console.log(conditionalSum([1, 2, 3, 4, 5], "even"));
console.log(conditionalSum([1, 2, 3, 4, 5], "odd"));
console.log(conditionalSum([13, 88, 12, 44, 99], "even"));
console.log(conditionalSum([], "odd"));
코드 동작 방식
- 짝수 판별: add 함수는 condition이 "even"일 때, 현재값을 2로 나눈 나머지가 0이면 누적값에 더합니다.
- 홀수 판별: condition이 "odd"일 때는 나머지가 1인 경우, 즉 홀수일 때만 값을 더합니다.
- 조건 불일치: 어떤 조건에도 해당하지 않으면 기존 누적값을 그대로 반환하여 합계에 영향을 주지 않습니다.
- 초기값 0: reduce()의 두 번째 인자로 0을 전달했기 때문에, 빈 배열이 들어오더라도 오류 없이 안전하게 0을 반환합니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
6 9 144 0
이처럼 reduce() 메서드를 사용하면 별도의 반복문 없이도 조건부 합산 로직을 깔끔하게 구현할 수 있습니다. filter()로 먼저 조건에 맞는 요소를 걸러낸 뒤 합산하는 방법도 가능하지만, reduce() 하나만으로 처리하면 배열을 한 번만 순회하기 때문에 코드도 간결하고 실행 효율도 더 높습니다.