프로젝트 오일러 22번 문제
여기 5천개 이상의 영문 이름들이 들어있는 46KB짜리 텍스트 파일 names.txt 이 있습니다 (우클릭해서 다운로드 받으세요). 이제 각 이름에 대해서 아래와 같은 방법으로 점수를 매기고자 합니다.
- 먼저 모든 이름을 알파벳 순으로 정렬합니다.
- 각 이름에 대해서, 그 이름을 이루는 알파벳에 해당하는 숫자(A=1, B=2, …, Z=26)를 모두 더합니다.
- 여기에 이 이름의 순번을 곱합니다.
예를 들어 "COLIN"의 경우, 알파벳에 해당하는 숫자는 3, 15, 12, 9, 14이므로 합이 53, 그리고 정렬했을 때 938번째에 오므로 최종 점수는 938 × 53 = 49714가 됩니다.
names.txt에 들어있는 모든 이름의 점수를 계산해서 더하면 얼마입니까?
파이썬 코드
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 | # -*- coding: utf-8 -*- f = open("E:/names.txt",'r') s = f.read() f.close() temp = s.split(',') wordslist = [] #순수단어만 뽑아서 저장할 list for words in temp: #단어 양옆에 "제거 wordslist.append(words.strip('"')) wordslist.sort() #단어를 알파벳 순으로 정렬 #알파벳에 해당하는 숫자(점수) point = {'A':1, 'B':2, 'C':3, 'D':4, 'E':5, 'F':6, 'G':7, 'H':8, 'I':9, 'J':10, 'K':11, 'L':12, 'M':13, 'N':14, 'O':15, 'P':16, 'Q':17, 'R':18, 'S':19, 'T':20, 'U':21, 'V':22, 'W':23, 'X':24, 'Y':25, 'Z':26} result = 0 #단어의 점수를 총합할 변수 words_point = 0 #각 단어의 점수를 저장할 변수 index = 1 #몇번째 단어인지 위치를 나타내는 변수 for words in wordslist: for alphabet in words: words_point += point[alphabet] result = result + words_point * (wordslist.index(words)+1) #한 단어의 점수 합과 해당 단어의 위치를 곱한다 words_point = 0 print result | cs |
코드설명
파일을 읽어온다. 텍스트 파일에서 ,를 기준으로 단어를 나누어 리스트(temp)에 저장한다. 그 후, 단어양옆에 "을 제거하여 순수한 알파벳 단어만 남게하여 리스트(wordslist)에 저장한다.
리스트 내장함수 sort를 이용하여, 단어를 알파벳 순으로 정렬한다. 알파벳별 점수를 나타내는 point라는 사전을 만든다. 그 후, 리스트에서 단어를 하나씩 꺼내서 각 알파벳별 점수를 더한다. 그리고 정렬된 단어 순서를 곱하여 최종적인 점수를 구한다.
'programming' 카테고리의 다른 글
프로젝트 오일러(Project Euler) 23번 문제 (0) | 2016.01.07 |
---|---|
뇌를 자극하는 C# 5.0 프로그래밍 Chapter6 연습문제 풀이 (0) | 2016.01.04 |
뇌를 자극하는 C# 5.0 프로그래밍 Chapter5 연습문제 풀이 (0) | 2016.01.04 |
뇌를 자극하는 C# 5.0 프로그래밍 Chapter4 연습문제 풀이 (0) | 2015.12.30 |
[안드로이드]안드로이드 4대 컴포넌트 (3) | 2015.11.06 |