[백준 파이썬] 1339 단어 수학

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

 

1339번: 단어 수학

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

www.acmicpc.net

 

문제

etc-image-0



알파벳에 적절한 숫자를 부여하여 합이 최대가 되게 하는 문제이다.


풀이

 

먼저 최대값을 구하는 방법을 생각해야한다.

예제의 GCF + ACDEB의 경우

783 + 98654 로 계산할 수 있다.

이는 가장 높은 자리의 알파벳에는 높은 숫자를 부여하고 낮은 자리의 알파벳은 낮은 숫자를 부여하는 방법으로 해결할 수 있다.

 

먼저 단어를 입력받고 해당 단어를 배열로 저장한다.

그러면

['G', 'C', 'F']

['A', 'C', 'D', 'E', 'B']

의 형태로 저장될 수 있다.

또한 알파벳에 숫자를 할당하기 위해 dictionary를 사용한다.

S = [list(input()) for _ in range(N)]
words = {}

 

이후 각 배열을 순회하며 알파벳에 가중치를 부여한다.

G, C, F의 경우 자리수를 고려하여 G에 10^2, C에 10^1, F에 1을 더하여 dictionary에 넣어준다.

이렇게하면 dictionary자료형인 word에

word[G] = 100

word[C] = 10

word[F] = 1

의 숫자가 부여된다.

 

또한 이미 부여되어있는 알파벳일 경우 해당 배열의 자리수의 따라 합해준다.

for s in S:
    x = len(s) - 1
    for i in s:
        if i in words:
            words[i] += 10**x
        else:
            words[i] = 10**x
        x -= 1

 

이렇게 부여한 가중치를 역순으로 정렬하여 변수에 할당한다.

그러면 다음과 같은 배열이 나오게된다.

[10000, 1010, 100, 100, 10, 1, 1]

sortedWord = sorted(words.values(), reverse=True)

 

마지막으로 sortedWord를 순회하며 9부터 곱해주면 정답이 된다.

num = 9
for k in sortedWord:
    result += k * num
    num -= 1

 

 

 

코드

from collections import deque

N = int(input())

S = [list(input()) for _ in range(N)]
words = {}

for s in S:
    x = len(s) - 1
    for i in s:
        if i in words:
            words[i] += 10**x
        else:
            words[i] = 10**x
        x -= 1
        
sortedWord = sorted(words.values(), reverse=True)
result = 0

num = 9
for k in sortedWord:
    result += k * num
    num -= 1
print(result)