티스토리 뷰

[Gold 4] 1339번: 단어 수학 -Python

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

 

1339번: 단어 수학

첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대

www.acmicpc.net

 


처음에는 입력된 문자열 중 길이가 긴 순서대로 정렬한 후 높은 자리에 위치한 알파벳부터 9 ~ 0 까지

 

할당해주려고 했으나, ACDEB + GCF 의 예제에서 원하는 값을 얻지 못함 => 그리디 알고리즘

 

100의 자리인 D와 G의 값을 어떤 기준으로 설정해주어야 할지 애매하였다

 

다른 실력자분들이 해결한 코드를 살짝 참조하여보니, 자리수마다 알파벳의 가중치를 두어 계산하면 되는 것 이었다 !

 

import sys

N = int(input())

word_list = []
word_list = [sys.stdin.readline().strip() for i in range(N)]

alpha_list = []
for word in word_list:
    alpha_list.append(list(word)) # => 단어를 알파벳당 하나씩 쪼개서 리스트에 추가
    
# print('alpha_list : ' , end='') 
# print(alpha_list)

alpha_dict = {}
for alpha in alpha_list: # 알파벳의 자리수에 해당하는 10000, 1000, 100.. 값을 {key, value} 형태로 저장
    k = len(alpha) - 1 # 단어 하나의 길이. ABCDE => A = 10^4 ... 
    for v in alpha:
        if v in alpha_dict: # 이미 dictionay에 있는 경우
            alpha_dict[v] += pow(10,k) 
        else:
            alpha_dict[v] = pow(10,k)
        k -= 1
            
data_list = []

for data in alpha_dict.values():
    data_list.append(data)

data_list.sort(reverse=True)

num_list = [0,1,2,3,4,5,6,7,8,9]
res = 0
for data in data_list:
    res += data * num_list.pop() # data_list의 data들을 9 ~ 0 사이의 해당되는 값과 곱해준다.

print(res)

변수이름을 더 명확하게 쓰는 습관을 들여야할 것 같다 !!!
 

댓글