콘텐츠로 건너뛰기
Home » 오일러 프로젝트 22

오일러 프로젝트 22

여기 5천개 이상의 영문 이름들이 들어있는 46KB짜리 텍스트 파일 names.txt 이 있습니다 (우클릭해서 다운로드 받으세요). 이제 각 이름에 대해서 아래와 같은 방법으로 점수를 매기고자 합니다. 먼저 모든 이름을 알파벳 순으로 정렬합니다. 각 이름에 대해서, 그 이름을 이루는 알파벳에 해당하는 숫자(A=1, B=2, …, Z=26)를 모두 더합니다. 여기에 이 이름의 순번을 곱합니다. 예를 들어 “COLIN”의 경우, 알파벳에 해당하는 숫자는 3, 15, 12, 9, 14이므로 합이 53, 그리고 정렬했을 때 938번째에 오므로 최종 점수는 938 × 53 = 49714가 됩니다. names.txt에 들어있는 모든 이름의 점수를 계산해서 더하면 얼마입니까?

http://euler.synap.co.kr/prob_detail.php?id=21

접근 및 풀이

문제에서 주어지는 모든 이름은 대문자로 구성되어 있고, A=1, B=2,…. 등으로 알파벳 순서대로 글자에 점수를 부여하는 가장 쉬운 방법은 각 문자의 아스키코드값에 64를 빼는 것이다. A의 아스키코드가 65이므로 ord(‘A’) – 64 == 1 이되기 때문이다.

파일을 읽어들여서 콤마로 구분하고, 다시 이를 알파벳 순서대로 정렬한 다음, enumerate() 함수를 사용하여 순번과 각 단어를 순회하면서 점수를 계산하고 합산하면 된다.

from urllib.request import urlopen

with urlopen('http://euler.synap.co.kr/files/names.txt') as f:
  names = sorted(x.strip('"') for x in f.read().decode().split(','))
  print(sum(sum(ord(c) - 64 for c in word) * (i + 1) \
        for i, word in enumerate(names))