프로젝트 오일러 017
숫자를 영단어로 변환하기
문제
이 문제에서 까다로운 부분은, 생각보다 기수를 영어로 쓴 단어들의 스펠링이 가물가물하다는 것입니다.
- 1,000은 1개 케이스이므로 별도로 처리합니다.
- one, two, three, ..., nineteen 까지 별개의 단어로 표현되는 숫자는 1 ~ 19까지입니다.
- 100단위의 값이 있으면 "hundread" 가 추가되며, 10단위 이하가 남아있으면 "and"가 있어야 합니다.
이상의 내용을 바탕으로 숫자를 영단어로 변환하는 read_number() 함수를 아래와 같이 작성합니다.
def read_number(n: int) -> str:
if n == 1000:
return "onethousand"
res = []
ws1 = (". one two three four five six seven eight nine ten eleven twelve thirteen "
"fourteen fifteen sixteen seventeen eighteen nineteen").split()
ws2 = (". . twenty thirty forty fifty sixty seventy eighty ninety").split()
h, n = divmod(n, 100)
if h > 0:
res.extend([ws1[h], "hundred", "and" if n > 0 else ""])
if n > 19:
t, n = divmod(n, 10)
res.extend([ws2[t], ws1[n] if n > 0 else ""])
else:
res.append(ws1[n] if n > 0 else '')
return ''.join(res)
print(read_number(293))
# twohundredandninetythree
몇 가지 숫자에 대해서 테스트를 더 해본 후, 이제 정답을 구해볼 차례입니다.
print(sum(len(read_number(n + 1)) for n in range(1000)))