숫자를 입력받아 각 자릿수를 반복해서 더하고, 최종적으로 한 자리 숫자에 도달할 때까지 이 과정을 반복하는 JavaScript 함수를 작성하는 것이 목표입니다. 예를 들어 123456의 경우 1+2+3+4+5+6 = 21이 되고, 다시 2+1 = 3으로 수렴하게 됩니다.
이 문제는 아래의 두 가지 방법으로 해결할 수 있습니다.
방법 1: while 반복문 사용
이 방식은 while 반복문을 활용해 숫자의 각 자릿수를 계속 더하는 접근 방식입니다. 내부 반복문은 현재 숫자의 모든 자릿수를 하나씩 더하고, 외부 반복문은 그 결과가 한 자리 숫자가 될 때까지 전체 과정을 반복합니다.
예제 코드
const num = 123456;
const addDigits = (num = 1) => {
let sum = num;
while(sum % 10 !== sum){
let sum1 = 0;
while(sum > 0){
sum1 += sum % 10;
sum = Math.floor(sum / 10);
}
sum = sum1;
};
return sum;
};
console.log(addDigits(num));
방법 2: 상수 시간(O(1)) 솔루션 사용
이 방식은 수학의 합동 공식(Congruence Formula), 즉 디지털 루트(Digital Root) 공식을 활용합니다. 어떤 숫자의 자릿수 합을 반복했을 때의 최종 결과는 (num - 1) % 9 + 1과 같다는 성질을 이용하므로, 반복문 없이 단 한 번의 연산만으로 답을 구할 수 있습니다. 이 공식에 대해 더 깊이 이해하고 싶다면 관련 수학 개념을 추가로 학습해 보시기 바랍니다.
예제 코드
const num = 123456;
const addDigits = (num = 1) => {
let predicate = (num - 1) % 9;
return ++predicate;
};
console.log(addDigits(num));
실행 결과
두 방법 모두 콘솔에 동일한 결과를 출력합니다.
3
첫 번째 방법은 코드가 직관적이어서 로직을 이해하기 쉬운 반면, 입력값의 크기에 따라 연산 횟수가 늘어납니다. 반면 두 번째 방법은 시간 복잡도가 O(1)이므로 매우 큰 숫자가 입력되더라도 일정한 성능을 보장한다는 장점이 있습니다.