본문 바로가기

알고리즘/백준 (Pyhthon)

[알고리즘] 백준 17269 이름궁합 테스트 / python

https://www.acmicpc.net/problem/17269

 

17269번: 이름궁합 테스트

시윤이는 좋아하는 이성이 생기면 가장 먼저 이름궁합부터 본다. 이름궁합을 보는 방법은 간단하다. 먼저 이름을 알파벳 대문자로 적는다. 각 알파벳 대문자에는 다음과 같이 알파벳을 적는데 필요한 획수가 주어진다. 예를 들어, 두 사람의 이름인 LEESIYUN, MIYAWAKISAKURA 를 같이 표현했을 때 다음과 같이 먼저 주어진 이름부터 한 글자씩 적는다. 두 사람의 이름을 알파벳 대문자로 표현한 뒤, 한 글자씩 번갈아가며 적는다. 예시 :  L M E

www.acmicpc.net

 

import copy
dic = {'A':3,'B':2,'C':1,'D':2,'E':4,'F':3,'G':1,'H':3,'I':1,'J':1,'K':3,'L':1,'M':3,'N':2,'O':1,'P':2,'Q':2,'R':2,'S':1,'T':2,'U':1,'V':1,'W':1,'X':2,'Y':2,'Z':1}
N, M = map(int, input().split())
A, B = input().split()

min_len = min(N,M)
new = []
for i in range(min_len):
    new += A[i] + B[i]

if N > M:
    new += A[min_len:]
elif N < M:
    new += B[min_len:]

new_num = []
for j in new:
    new_num.append(dic[j])

while len(new_num) > 2:
    temp = []
    for k in range(1, len(new_num)):
        temp_num = new_num[k-1] + new_num[k]
        if temp_num >= 10:
            temp_num -= 10
        temp.append(temp_num)
    new_num = copy.deepcopy(temp)

print("{}%".format(new_num[0]*10 + new_num[1]))

 

N, M = map(int, input().split())
A, B = input(). split()

alp = [3,2,1,2,4,3,1,2,1,1,3,1,3,2,1,2,2,2,1,2,1,1,1,2,2,1]

AB = ''
min_len = min(N, M)
for i in range(min_len):
    AB += A[i] + B[i]

AB += A[min_len:] + B[min_len:]

lst = [alp[ord(i)-ord('A')] for i in AB]

for i in range(N+M-2):
    for j in range(N+M-i-1):
        lst[j] += lst[j+1]

print("{}%".format(lst[0] %10*10 + lst[1] %10))
마지막 for문에서 lst의 범위를 줄여가며 앞의 값에 뒤의 값을 더한다. lst[0] += lst[1]이 끝일때까지
lst[0]과 lst[1]에 앞의 값들을 더한걸 넣어줬으니 출력한다.

ord함수는 아스키코드를 숫자로 표현하는 함수
A는 32부터 시작~
alp[ord('C')-ord('A')] = alp[2] 이므로 C의 획수를 찾을 수 있다.