Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

한 자리 숫자가 될 때까지 각 자릿수를 반복해서 더하는 방법 - JavaScript

이번 글에서는 숫자의 각 자릿수를 재귀적으로 더해, 결과가 한 자리 숫자가 될 때까지 반복하는 JavaScript 함수를 작성해 보겠습니다. 조건은 숫자를 문자열(String)이나 다른 데이터 타입으로 변환하지 않고 처리해야 한다는 것입니다.

접근 방식

핵심 아이디어는 다음과 같습니다.

1. 나머지 연산자(%)를 사용해 마지막 자릿수를 추출합니다. 예를 들어 num % 10은 일의 자리 숫자를 반환합니다.

2. Math.floor(num / 10)을 사용해 마지막 자릿수를 제거한 나머지 부분을 구합니다.

3. 이 과정을 재귀 호출로 반복하여 모든 자릿수를 합산합니다.

4. 합산 결과가 아직 두 자리 이상이라면, 같은 과정을 다시 반복합니다.

예제 코드

다음은 전체 구현 코드입니다.

const num = 546767643;

// 각 자릿수를 재귀적으로 합산하는 함수
const sumDigit = (num, sum = 0) => {
    if(num){
        return sumDigit(Math.floor(num / 10), sum + (num % 10));
    }
    return sum;
};

// 결과가 한 자리 숫자가 될 때까지 반복하는 함수
const sumRepeatedly = num => {
    while(num > 9){
        num = sumDigit(num);
    };
    return num;
};

console.log(sumRepeatedly(num));

실행 결과

위 코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.

3

동작 원리 살펴보기

예제에서 사용한 숫자 546767643의 과정을 단계별로 확인해 보겠습니다.

- 첫 번째 합산: 5 + 4 + 6 + 7 + 6 + 7 + 6 + 4 + 3 = 48

- 두 번째 합산: 4 + 8 = 12

- 세 번째 합산: 1 + 2 = 3

결과가 3으로 한 자리 숫자가 되었으므로 반복이 종료됩니다.

참고: 디지털 루트(Digital Root) 공식

수학적으로 이 값은 '디지털 루트'라고 불리며, 반복문 없이 O(1) 시간 복잡도로 계산할 수도 있습니다. 양의 정수 n에 대해 n % 9를 활용하면 되는데, n이 0일 경우만 예외적으로 처리하면 됩니다.

const digitalRoot = num => num === 0 ? 0 : (num % 9 === 0 ? 9 : num % 9);

console.log(digitalRoot(546767643)); // 3

재귀 방식은 로직을 이해하기 좋고, 디지털 루트 공식은 성능 면에서 유리하므로 상황에 맞게 선택하여 사용하시면 됩니다.