숫자를 하나 입력받아 각 자릿수의 합을 재귀적으로 계산하고, 그 결과가 한 자리 숫자(10 미만)가 될 때까지 반복하는 함수를 작성해야 합니다.
예시
findSum(12345) = 1+2+3+4+5 = 15 = 1+5 = 6
따라서 최종 출력 결과는 6이 되어야 합니다.
재귀를 활용한 구현
이제 findSum() 함수의 코드를 작성해 보겠습니다.
// using recursion
const findSum = (num) => {
if(num < 10){
return num;
}
const lastDigit = num % 10;
const remainingNum = Math.floor(num / 10);
return findSum(lastDigit + findSum(remainingNum));
}
console.log(findSum(2568));
코드 동작 원리
함수는 먼저 입력된 숫자가 10보다 작은지 확인합니다. 10보다 작다면 이미 한 자리 숫자이므로 그대로 반환하면 됩니다. 그렇지 않은 경우에는 나머지 연산자(%)를 사용해 마지막 자릿수를 추출하고, Math.floor()를 이용해 마지막 자릿수를 제외한 나머지 숫자를 구한 뒤 재귀적으로 함수를 호출합니다. 이 과정은 값이 10 미만이 될 때까지 반복되며, 최종적으로 한 자리 숫자가 반환됩니다.
따라서 위 코드의 실행 결과는 다음과 같습니다.
3
추가 팁: O(1) 시간 복잡도로 해결하기
이 문제는 수학에서 '디지털 루트(digital root)'라고 알려진 개념과 같습니다. 9로 나눈 나머지의 성질을 활용하면 재귀나 반복 없이 상수 시간에 답을 구할 수 있습니다.
const digitalRoot = (num) => {
if (num === 0) return 0;
return 1 + (num - 1) % 9;
}
console.log(digitalRoot(2568)); // 3입력값이 매우 큰 경우에도 이 공식을 사용하면 성능 저하 없이 즉시 결과를 얻을 수 있습니다.