Algorithm/Baekjoon

1339. 단어 수학 (Python)

원만사 2022. 3. 4. 14:32
반응형
 

1339번: 단어 수학

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

www.acmicpc.net

 

풀이

 각 알파벳의 자릿수를 더하여 높은 숫자를 가진 알파벳 순으로 큰 숫자로 바꾸면 된다. 

 

 위의 예제에서 첫 번째 단어인 GCF를 보면 G는 100의 자리, C는 10의 자리, F는 1의 자리에 있다. 두 번째 단어인 ACDEB를 보면 A는 10000의 자리, C는 1000의 자리, D는 100의 자리, E는 10의 자리, B는 1의 자리에 있다. 딕셔너리를 사용하여 이를 나타내면 

{'A': 10000, 'C': 1010, 'D': 100, 'G': 100, 'E': 10, 'B': 1, 'F': 1}이 된다. 이제 각 알파벳을 숫자로 바꾸면 값이 큰 순서대로 

A = 9, C = 8, D = 7, G = 6, E = 5, B = 4, F = 3이 된다.

 결국 식은 683 + 98754가 되고 이를 계산하면 99437이 나오는 것을 알 수 있다.

 

코드

from collections import defaultdict

if __name__ == '__main__':
    N = int(input())  # 단어의 개수
    words = []  # 단어들
    alphabets = defaultdict(int)  # 각 알파벳의 자릿수를 합한 결과를 모아 놓는 딕셔너리
    alphaNum = [0 for _ in range(26)]  # 각 알파벳에 사용될 숫자를 저장해 놓는 리스트

    for _ in range(N):
        word = input()
        tmp = 10 ** (len(word) - 1)  # 현재 알파벳의 자릿수

        for w in word:
            alphabets[w] += tmp  # 딕셔너리에 현재 알파벳의 자릿수를 더한다
            tmp //= 10

        words.append(word)

    sortedAlphabets = sorted(
        alphabets.items(), key=lambda x: x[1], reverse=True)  # 딕셔너리를 값에 따라 내림차순 정렬

    num = 9  # 알파벳에 배정될 숫자
    for (alpha, _) in sortedAlphabets:
        alphaNum[ord(alpha) - 65] = num  # 현재 알파벳에 num 배정
        num -= 1

    res = 0
    for word in words:
        tmp = 0
        for c in word:
            tmp = tmp * 10 + alphaNum[ord(c) - 65]
        res += tmp

    print(res)
반응형