Little Jay

[Python][Projet Euler] 1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는? - 017 본문

알고리즘/Project_Euler

[Python][Projet Euler] 1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는? - 017

Jay, Lee 2022. 1. 27. 19:37
1부터 5까지의 수를 영어로 쓰면 one, two, three, four, five 이고,각 단어의 길이를 더하면 3 + 3 + 5 + 4 + 4 = 19 이므로 사용된 글자는 모두 19개입니다.
1부터 1,000까지 영어로 썼을 때는 모두 몇 개의 글자를 사용해야 할까요?
참고: 빈 칸이나 하이픈('-')은 셈에서 제외하며, 단어 사이의 and 는 셈에 넣습니다.  예를 들어 342를 영어로 쓰면 three hundred and forty-two 가 되어서 23 글자,  115 = one hundred and fifteen 의 경우에는 20 글자가 됩니다.

 

프로젝트 오일러는 문제를 푼 사람만 입장 가능한 포럼이라는 곳이 존재하는데,

거기 있는 코드들을 보고 깜짝 놀랐다.

 

처음에는 selenium으로 

https://pypi.org/project/num2words/ 

아래의 사이트에서 긁어와서 풀까 생각하다가 

코드가 너무 지저분해질까봐 노가다로 풀었다.

(사실 딕셔너리 만들때 알파벳 개수 잘못세서 한참 헤맨건 덤......)

 

cumsum:int = 0
one_init = {0: 0, 1: 3, 2: 3, 3: 5, 4: 4, 5: 4, 6: 3, 7: 5, 8: 5, 9: 4 }
ten_init = {0: 3, 1: 6, 2: 6, 3: 8, 4: 8, 5: 7, 6: 7, 7: 9, 8: 8, 9: 8}
ten_init2 = {0: 0, 1: 0, 2: 6, 3: 6, 4: 5, 5: 5, 6: 5, 7: 7, 8: 6, 9: 6}


for i in range(1, 1001):
    temp = str(i)
    if len(temp) == 1:
        cumsum += one_init[i]
    elif len(temp) == 2:
        if int(temp[0]) == 1:
            cumsum += ten_init[i % 10]
        else:
            cumsum += ten_init2[int(i / 10)] + one_init[i % 10]
    elif len(temp) == 3:
        x, y = i / 100, i % 100
        x = int(x)
        if y == 0:
            cumsum += one_init[x] + 7
            continue
        cumsum += one_init[x] + 10
        if temp[1] == "1":
            cumsum += ten_init[y % 10]
        else:
            cumsum += ten_init2[int(y/10)] + one_init[y % 10]
    else:
        cumsum += 11

print(cumsum)

 

전혀 몰랐는데 파이썬에 정~~~말 특이한 라이브러리가 있다

바로 num2word라는 라이브러리인데, 

예상치 못했지만 말그대로 숫자를 문제에서 제시한 영어 그래도 바꿔주는 라이브러리이다.

(심지어 한글로도 바꿔준다)

아래의 문서에서 사용법을 찾아볼 수 있다

https://pypi.org/project/num2words/

 

그래서 당연히 단 5줄 정도의 코드로 문제를 해결할 수 있다.

from num2words import num2words

cumsum:int=0
for i in range(1, 1001):
    cumsum = cumsum + len(((num2words(i))
                           .replace(" ",""))
                            .replace("-",""))

print(cumsum)
Comments