문제 이해하기
숫자 하나를 입력받아 각 자릿수를 계속 더하고, 그 결과가 한 자리 숫자가 될 때까지 반복하는 JavaScript 함수를 작성해야 합니다.
예를 들어, 다음과 같은 숫자가 주어졌다고 가정해 보겠습니다.
const num = 5798;
자릿수 합산 과정은 다음과 같습니다.
5 + 7 + 9 + 8 = 29
2 + 9 = 11
1 + 1 = 2
따라서 최종 출력값은 2가 됩니다.
구현 방법
이 문제는 재귀 함수를 사용하면 깔끔하게 해결할 수 있습니다. 먼저 숫자의 각 자릿수를 더하는 함수를 만들고, 그 결과가 아직 두 자리 이상이라면 합산을 다시 반복하는 방식입니다.
const num = 5798;
const sumDigits = (num, sum = 0) => {
if(num){
return sumDigits(Math.floor(num / 10), sum + (num % 10));
};
return sum;
};
const repeatSum = (num) => {
if(num > 9){
return repeatSum(sumDigits(num));
};
return num;
};
console.log(repeatSum(num));
코드 설명
- sumDigits 함수: 나머지 연산자(
%)로 마지막 자릿수를 추출해 합계에 더하고,Math.floor(num / 10)으로 마지막 자릿수를 제거한 뒤 스스로를 재귀 호출합니다. 숫자가 0이 되면 누적된 합계를 반환합니다. - repeatSum 함수: 숫자가 9보다 크면, 즉 두 자리 이상이면
sumDigits의 결과를 가지고 다시 재귀 호출하여 한 자리 숫자가 될 때까지 반복합니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
2
추가 팁: 디지털 루트(Digital Root)
이렇게 얻어진 한 자리 숫자는 수학에서 '디지털 루트'라고 부릅니다. 사실 이 값은 모듈러 연산을 이용하면 반복 없이 한 번에 구할 수도 있습니다. 양의 정수 n에 대해 n % 9가 0이면 9, 그렇지 않으면 n % 9가 곧 디지털 루트가 됩니다(단, n이 0인 경우는 0). 대용량 숫자를 자주 처리해야 한다면 이 방법이 훨씬 효율적입니다.