파이썬 실전 프로젝트

프로젝트 오일러 22번 - 알파벳-숫자변환

토픽 파이썬 실전 프로젝트 > 파이썬으로 수학문제 풀기 > 프로젝트 오일러(22번~100번)

약 5천개의 영문이름이 있는데, 각 이름의 알파벳을 A=1,B=2,,, 의 숫자로 치환해서 합산한 다음, 그 이름의 index와 곱해서 전체를 누적하는 것이 문제입니다.

예를 들어, 리스트의 첫번째이름은 MARY 이고, 이를 숫자로 변환하면, M=13,A=1,R=18 ,Y=25 이고, 합은 13+1+18+25=57이고, 인덱스는 5000개중에 1번이기 때문에, 57*1=57입니다. (인덱스는 알파벳순으로 정렬을  다시해야해서, 인덱스값이 달라집니다.)

 

파일 내용확인
with open('q022_data.txt') as data:
    contents = data.read()
print(contents)
"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET","DOROTHY","LISA","NANCY","KAREN","BETTY","HELEN","SANDRA","DONNA","CAROL","RUTH","SHARON","MICHELLE","LAURA","SARAH","KIMBERLY","DEBORAH","JESSICA","SHIRLEY","CYNTHIA","ANGELA","MELISSA","BRENDA","AMY","ANNA","REBECCA","VIRGINIA","KATHLEEN","PAMELA","MARTHA","DEBRA","AMANDA","STEPHANIE",,,,,,,,,,,,,,

텍스트 안에는 따옴표(")와 콤마(,)가 혼합된 상태입니다.

 

텍스트 처리
with open('q022_data.txt') as data:
    names = data.read().replace('"','').split(',')
['MARY', 'PATRICIA', 'LINDA', 'BARBARA', 'ELIZABETH', 'JENNIFER', 'MARIA', 'SUSAN', 'MARGARET', 'DOROTHY', 'LISA', 'NANCY', 'KAREN', 'BETTY', 'HELEN', 'SANDRA', 'DONNA', 'CAROL', 'RUTH', 'SHARON', 'MICHELLE', 'LAURA', 'SARAH', 'KIMBERLY', 'DEBORAH', 'JESSICA', 'SHIRLEY', 'CYNTHIA', 'ANGELA', 'MELISSA', 'BRENDA', 'AMY', 'ANNA', 'REBECCA', 'VIRGINIA', 'KATHLEEN', 'PAMELA', 'MARTHA',,,,,,,,,,

 다시 불러오면서, 따옴표는 치환명령으로 삭제를 해주었고, 컴마를 기준으로 split을 했습니다. split을 하고 나면, 데이터형은 List형으로 전환됩니다.

names.sort()
['AARON', 'ABBEY', 'ABBIE', 'ABBY', 'ABDUL', 'ABE', 'ABEL', 'ABIGAIL', 'ABRAHAM', 'ABRAM', 'ADA', 'ADAH', 'ADALBERTO', 'ADALINE', 'ADAM', 'ADAN', 'ADDIE', 'ADELA', 'ADELAIDA', 'ADELAIDE', 'ADELE',

 정렬을 해주고,

 

print(contents.isupper())
True

 아스키코드를 사용해서 숫자로 바꿀건데, 이름에 소문자가 섞여 있는지를 확인하기 위해서, contents.isupper() 명령을 실행해서 True가 나오는지 확인해주었습니다.

 

루프문 작성

for idx,val in enumerate(names[:20]):
    print(idx+1,val,end=' ')
    for i in val:
        print(ord(i)-64,end=',')
    print()
1 AARON 1,1,18,15,14,
2 ABBEY 1,2,2,5,25,
3 ABBIE 1,2,2,9,5,
4 ABBY 1,2,2,25,
5 ABDUL 1,2,4,21,12,
6 ABE 1,2,5,
7 ABEL 1,2,5,12,
8 ABIGAIL 1,2,9,7,1,9,12,
9 ABRAHAM 1,2,18,1,8,1,13,
10 ABRAM 1,2,18,1,13,
11 ADA 1,4,1,

 ord()는 문자의 아스키코드값을 얻어내는 명령입니다. 대문자A가 65이기 때문에, 64를 빼면, 1부터 시작하는 일련번호를 얻을수 있습니다.

 

합계 계산
with open('q022_data.txt') as data:
    names = data.read().replace('"','').split(',')
names.sort()

grand_total =0
for idx,val in enumerate(names):
    total=0
    for i in val:
        total=total+ord(i)-64
    grand_total+=total*(idx+1)
print(grand_total)

제대로 출력이 되는걸 확인했으면 전체 합산을 해주면 됩니다.

 

댓글

댓글 본문