개요
프로그래밍 문제 중 하나로, 주어진 숫자를 영어 단어 형태로 변환하는 작업이 있습니다. 숫자의 범위는 0부터 2³¹ − 1까지이며, 예를 들어 입력값이 512라면 결과는 "Five Hundred Twelve"가 되어야 합니다.
이번 글에서는 Python을 활용해 이 문제를 단계별로 해결하는 방법을 알아보겠습니다.
해결 접근 방식
이 문제는 숫자를 자릿수 단위로 나누어 처리하는 재귀적 방법으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.
- less_than_20 리스트: 1부터 19까지의 숫자에 해당하는 영어 단어를 저장합니다. (One, Two, ..., Nineteen)
- tens 리스트: 십의 자리 단어들을 저장합니다. (Twenty, Thirty, ..., Ninety)
- thousands 리스트: 큰 단위 단어들을 저장합니다. (Thousand, Million, Billion)
helper() 함수 로직
1,000 미만의 숫자를 단어로 변환하는 helper() 함수는 다음 규칙에 따라 동작합니다.
- n이 0이면 빈 문자열을 반환합니다.
- n이 20 미만이면 less_than_20[n]을 반환합니다.
- n이 100 미만이면 tens[n//10]에 helper(n mod 10) 결과를 연결합니다.
- 그 외의 경우(100 이상)에는 less_than_20[n//100]에 "Hundred"를 붙이고 helper(n mod 100) 결과를 연결합니다.
메인 함수 로직
전체 숫자를 처리하는 메인 함수는 다음 순서로 진행됩니다.
- num이 0이면 "Zero"를 반환합니다.
- 결과를 담을 빈 문자열 ans와 인덱스 i를 초기화합니다.
- num이 0보다 큰 동안 반복하며, num을 1,000으로 나눈 나머지가 0이 아니면 해당 부분을 단어로 변환하고 thousands[i] 단위를 붙여 앞쪽에 추가합니다.
- num을 1,000으로 나누고 i를 증가시켜 다음 자릿수 단위로 이동합니다.
- 반복이 끝나면 양 끝의 공백을 제거한 ans를 반환합니다.
구현 예제
아래 코드를 통해 실제 구현 방법을 확인할 수 있습니다.
class Solution(object):
less_than_20 = ["", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"]
tens = ["", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"]
thousands = ["", "Thousand", "Million", "Billion"]
def numberToWords(self, num):
if num == 0:
return "Zero"
ans = ""
i = 0
while num > 0:
if num % 1000 != 0:
ans = self.helper(num % 1000) + Solution.thousands[i] + " " + ans
i += 1
num //= 1000
return ans.strip()
def helper(self, n):
if n == 0:
return ""
elif n < 20:
return Solution.less_than_20[n] + " "
elif n < 100:
return Solution.tens[n // 10] + " " + self.helper(n % 10)
else:
return Solution.less_than_20[n // 100] + " Hundred " + self.helper(n % 100)
ob = Solution()
print(ob.numberToWords(512))
print(ob.numberToWords(7835271))입력
512 7835271
출력
Five Hundred Twelve Seven Million Eight Hundred Thirty Five Thousand Two Hundred Seventy One
마무리
이 알고리즘은 숫자를 세 자리씩 묶어 처리하기 때문에 시간 복잡도가 O(log n) 수준으로 매우 효율적입니다. 재귀 호출을 통해 각 자릿수 그룹을 독립적으로 변환하고, Thousand·Million·Billion 같은 단위 단어를 적절히 조합함으로써 최대 32비트 정수 범위까지 안정적으로 처리할 수 있습니다. 금액 표기, 음성 안내 시스템, 청구서 생성 등 다양한 실무 시나리오에서 유용하게 활용할 수 있는 패턴입니다.