문제 이해하기
음수 정수 하나를 입력받아 그 숫자의 각 자릿수 합을 반환하는 JavaScript 함수를 작성해야 합니다. 여기서 핵심은 마이너스(-) 기호 바로 뒤에 오는 첫 번째 자릿수가 음수로 취급된다는 점입니다.
예를 들어 입력값이 다음과 같다면 −
-5456
출력 결과
첫 자릿수인 5는 음수로 계산되므로, 출력은 다음과 같습니다 −
(-5) + 4 + 5 + 6
10
예제 코드
이 문제를 해결하는 코드는 다음과 같습니다 −
const num = -5456;
const sumNum = num => {
return String(num).split("").reduce((acc, val, ind) => {
if(ind === 0){
return acc;
}
if(ind === 1){
acc -= +val;
return acc;
};
acc += +val;
return acc;
}, 0);
};
console.log(sumNum(num));
코드 동작 원리
위 코드의 실행 흐름을 단계별로 살펴보겠습니다.
- 문자열 변환: String(num)으로 숫자를 문자열 "-5456"으로 바꾼 뒤, split("")으로 한 글자씩 나누어 ["-", "5", "4", "5", "6"] 배열을 만듭니다.
- 부호 건너뛰기: reduce()의 인덱스(ind)가 0일 때는 마이너스 기호이므로 아무 작업 없이 그대로 넘어갑니다.
- 첫 자릿수 음수 처리: 인덱스가 1일 때는 해당 숫자를 빼서(acc -= +val) 음수로 만듭니다. 초기값 0에서 5를 빼면 -5가 됩니다.
- 나머지 자릿수 더하기: 이후 인덱스부터는 숫자를 더해 최종 합계를 구합니다. 즉, -5 + 4 + 5 + 6 = 10이 됩니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
10
참고: 단순 절댓값 합계가 필요한 경우
부호를 고려하지 않고 모든 자릿수를 단순히 더하고 싶다면 Math.abs()를 활용하는 것이 훨씬 간단합니다.
const num = -5456;
const absSum = String(Math.abs(num))
.split("")
.reduce((acc, val) => acc + Number(val), 0);
console.log(absSum); // 20
이 방식은 5 + 4 + 5 + 6 = 20을 반환하므로, 요구 사항에 따라 두 가지 방법 중 적절한 것을 선택하면 됩니다.