문제 이해하기
양의 정수 n이 주어졌을 때, 모든 자릿수를 더해 새로운 숫자를 만들고, 그 결과가 10보다 작아질 때까지 이 과정을 반복하는 문제입니다.
예를 들어 입력이 9625라면 다음과 같이 진행됩니다.
- 9 + 6 + 2 + 5 = 22
- 2 + 2 = 4
결과가 한 자리 수인 4가 되었으므로 최종 출력은 4입니다. 참고로 이렇게 얻어지는 값은 수학에서 '디지털 루트(Digital Root)'라고 불리는 개념과 같습니다.
해결 접근 방법
이 문제는 재귀(Recursion)를 활용하면 간단하게 해결할 수 있습니다.
- solve() 메서드를 정의하고, 매개변수로 n을 받습니다.
- n이 10보다 작으면 이미 한 자리 수이므로 n을 그대로 반환합니다.
- 합계를 저장할 변수 s := 0으로 초기화합니다.
- l := log(n)의 밑을 10으로 하는 로그값에 1을 더한 후 내림한 값(즉, n의 자릿수)으로 설정합니다.
- l이 0보다 큰 동안 반복합니다.
- s := s + (n mod 10)
- n := n / 10의 몫
- l := l - 1
- 반복이 끝나면 solve(s)를 재귀 호출하여 결과를 반환합니다.
구현 예제
import math
class Solution:
def solve(self, n):
if n < 10:
return n
s = 0
l = math.floor(math.log(n, 10) + 1)
while l > 0:
s += n % 10
n //= 10
l -= 1
return self.solve(s)
ob = Solution()
print(ob.solve(9625))입력
9625
출력
4
코드 설명
n % 10은 숫자의 가장 뒷자리(일의 자리)를 추출하고, n //= 10은 마지막 자릿수를 제거하는 연산입니다. 이 두 연산을 자릿수만큼 반복하면 전체 자릿수의 합을 구할 수 있습니다.
자릿수의 합 s를 구한 뒤에는 자기 자신인 solve(s)를 다시 호출하여, 합이 10 미만의 한 자리 수가 될 때까지 과정을 반복합니다. 이러한 재귀 구조 덕분에 코드가 간결하면서도 직관적으로 동작합니다.