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 글자가 됩니다.
사전 작업
one부터 onethound까지 일일이 입력할 수는 없다.
누군가는 입력해놓지 않았을까 하고 구글에 '1 to 1000 in english'를 검색했다. 그래서 이 사이트를 찾았다.
https://math.tools/table/counting/1-1000
숫자를 영어로 표기하는 방법이다. US와 UK에서 쓰는 방식이 다른가보다.
17번 문제에서는 UK 방식을 따라 and를 포함하라고 했다. 하지만 위 사이트에는 US 방식으로 표시되어 있다. 1부터 1000까지 and의 개수를 구해 따로 더해줘야한다.
아무튼 여기 있는 목록을 모조리 복사해서 '1_to_1000_in_english.txt'라는 파일에 붙어넣었다.
이제 이 파일을 불러와서 숫자와 공백, 하이픈을 없애고 문자 개수를 더하면 된다. 숫자와 공백을 없애는 코드, 이후 과정을 처리하는 코드를 나누었다.
1. euler17_remove.py
import re
lines = []
with open('1_to_1000_in_english.txt', 'r') as file:
for line in file:
res = []
p = re.compile("[^0-9]")
res =''.join(line.split())
lines.append(''.join(p.findall(res)))
with open('final.txt', 'w') as file:
file.write('\n'.join(lines))
숫자와 공백을 없애는 코드이다.
를 참고했다.
5행: 1_to_1000_in_english.txt을 읽기 모드로 연다.
6행: 파일에 쓰여 있는 내용을 한 줄씩 line에 가져온다.
8행: 정규표현식으로 제거할 내용을 표시한다. 0에서 9까지, 즉 숫자를 포함했다.
9행: line에 포함된 공백을 모두 제거한다. 숫자와 영어 사이의 공백(\t), 줄 마지막 개행문자(\n)을 제거한다.
10행: res에서 숫자를 제거해 lines 리스트에 추가한다.
12행: lines 리스트를 final.txt에 한 줄씩 쓴다.
final.txt를 실행하면 다음처럼 나온다.
2.euler17_solve.py
import re
lines = []
count = 0
with open('final.txt', 'r') as file:
for line in file:
res = []
p = re.compile("[^-]")
res = ''.join(line.split())
lines.append(''.join(p.findall(res)))
for i in lines:
count += len(i)
print(count)
하이픈을 없애고 문자 개수를 모두 더하는 코드이다.
6행: final.txt를 연다.7~11행: euler17_remove.py에서와 같은 코드를 이용한다. 이번엔 숫자가 아니라 하이픈을 없애야 하므로 정규표현식 내용을 [^0-9]에서 [^-]로 바꾸었다.13행~: 리스트에 있는 요소 하나하나의 길이를 구해 count에 더한다.
count는 and를 제외한 문자 수를 더한 값이다. 문제에서 원하는 정답은 and 개수도 포함한 값이다.and는 세 글자이다. and가 포함된 수는 101~199, 201~299, ... 901~999이다. 따라서 모든 문자 수는 3 * 99 * 9 = 2673개이다.
이제 count 값과 2673을 더하면 정답이다.
정답:
18451 + 2673 = 21124
'프로그래밍 > Baekjoon' 카테고리의 다른 글
(C언어,파이썬)백준 1978. 소수찾기 (0) | 2020.08.19 |
---|---|
(C언어)백준 10818. 최소, 최대 (0) | 2020.08.08 |
(파이썬)백준 10996.별 찍기 - 21 (0) | 2020.06.30 |
(파이썬)백준 2446. 별 찍기 - 9 (0) | 2020.06.30 |
(파이썬)백준 4673.셀프 넘버 (0) | 2020.06.30 |