Python으로 정수를 영어 단어로 변환하기
주어진 정수를 해당하는 영어 단어 표현으로 바꾸는 것은 대표적인 프로그래밍 연습 문제 중 하나입니다. 숫자의 범위는 0부터 231 − 1까지이며, 예를 들어 입력값이 512라면 출력은 "Five Hundred Twelve"가 되어야 합니다.
이 문제는 미리 정의된 단어 목록과 재귀 함수를 조합하면 깔끔하게 해결할 수 있습니다. 아래에서 단계별로 살펴보겠습니다.
1. 필요한 단어 목록 준비
less_than_20: One부터 Nineteen까지, 1~19에 해당하는 영어 단어를 담은 리스트tens: Ten, Twenty, Thirty처럼 10 단위 숫자 단어를 Ninety까지 담은 리스트thousands: Thousand(천), Million(백만), Billion(십억)처럼 큰 자릿수 단위를 담은 리스트
2. helper() 함수의 재귀 로직
- n이 0이면 빈 문자열을 반환합니다.
- n이 20보다 작으면
less_than_20[n]에 공백을 붙여 반환합니다. - n이 100보다 작으면
tens[n // 10]뒤에 helper(n % 10)의 결과를 이어 붙입니다. - 그 외의 경우(100 이상)
less_than_20[n // 100]에 "Hundred"를 붙이고, helper(n % 100)의 결과를 추가로 이어 붙입니다.
3. 메인 메서드(numberToWords)의 처리 순서
- num이 0이면 그대로 "Zero"를 반환합니다.
- 결과를 담을 문자열 ans와 단위 인덱스 i를 초기화합니다.
- num이 0보다 큰 동안 다음 과정을 반복합니다.
- num % 1000이 0이 아니면, helper(num % 1000)의 결과와 thousands[i]를 결합해 ans 앞에 추가합니다.
- i를 1 증가시키고, num을 1000으로 나눕니다.
- 반복이 끝나면 양쪽 공백을 제거한 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
동작 원리와 복잡도
이 알고리즘의 핵심은 숫자를 세 자리씩 끊어서 처리한다는 점입니다. 예를 들어 7,835,271은 "7(Million) / 835(Thousand) / 271"로 구분되며, 각 세 자리 묶음은 helper() 함수가 재귀적으로 "백 단위 → 십 단위 → 일 단위" 순서로 영어 단어로 변환합니다. 이렇게 만들어진 부분 문자열에 Thousand, Million 같은 단위 단어를 붙여 앞쪽부터 차례로 누적하면 최종 결과가 완성됩니다.
시간 복잡도는 숫자의 자릿수에 비례하므로 O(log10 n)이며, 사용하는 메모리 역시 자릿수 길이에 비례해 O(log10 n) 수준입니다. 덕분에 32비트 정수 범위 내의 어떤 값이라도 매우 빠르게 변환할 수 있습니다.