Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 컴공
- c++
- 컴공과
- 북리뷰
- 코딩
- 스택
- 개발
- 오퍼레이팅시스템
- 자료구조
- 정석학술정보관
- bfs
- 백준
- cs
- coding
- DP
- vector
- 정석
- 컴퓨터공학과
- 코테
- OS
- Computer science
- 문제풀이
- 구현
- 그래프
- 너비우선탐색
- 브루트포스
- 알고리즘
- Operating System
- Stack
- 오에스
Archives
- Today
- Total
Little Jay
[Python][Projet Euler] 1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는? - 017 본문
알고리즘/Project_Euler
[Python][Projet Euler] 1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는? - 017
Jay, Lee 2022. 1. 27. 19:371부터 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)
'알고리즘 > Project_Euler' 카테고리의 다른 글
[Python][Project Euler] 코딩퀴즈 1번 - '얼른 마스크'씨 회사 전기자동차의 행복한 일련번호 (0) | 2022.02.12 |
---|---|
[Python][Project Euler] 코딩퀴즈 6번 - 특정 구간내의 모든 피보나치 수의 합 (0) | 2022.02.12 |
[Python][Projet Euler] 가장 큰 소인수 구하기 - 003 (0) | 2022.02.02 |
[Python][Projet Euler] 피보나치 수열에서 4백만 이하이면서 짝수인 항의 합 - 002 (0) | 2021.07.13 |
[Python][ProjectEuler] 1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면? - 001번 (0) | 2021.06.30 |
Comments