프로젝트 오일러 017

숫자를 영단어로 변환하기

프로젝트 오일러 017
Photo by Perry Merrity II / Unsplash

문제

17번 문제
1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는?

이 문제에서 까다로운 부분은, 생각보다 기수를 영어로 쓴 단어들의 스펠링이 가물가물하다는 것입니다.

  • 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)))