Home 백준 1339번 단어 수학
Post
Cancel

백준 1339번 단어 수학

정보

문제 바로가기 [클릭]

난이도: Gold4

관련 개념: #그리디 알고리즘 #브루트포스


조건

시간 제한메모리 제한
2 초256 MB

문제

민식이는 수학학원에서 단어 수학 문제를 푸는 숙제를 받았다.

단어 수학 문제는 N개의 단어로 이루어져 있으며, 각 단어는 알파벳 대문자로만 이루어져 있다. 이때, 각 알파벳 대문자를 0부터 9까지의 숫자 중 하나로 바꿔서 N개의 수를 합하는 문제이다. 같은 알파벳은 같은 숫자로 바꿔야 하며, 두 개 이상의 알파벳이 같은 숫자로 바뀌어지면 안 된다.

예를 들어, GCF + ACDEB를 계산한다고 할 때, A = 9, B = 4, C = 8, D = 6, E = 5, F = 3, G = 7로 결정한다면, 두 수의 합은 99437이 되어서 최대가 될 것이다.

N개의 단어가 주어졌을 때, 그 수의 합을 최대로 만드는 프로그램을 작성하시오.


입력

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


출력

첫째 줄에 주어진 단어의 합의 최댓값을 출력한다.


예제 입출력 1

입력

1
2
3
2
AAA
AAA

출력

1
1998

예제 입출력 2

입력

1
2
3
2
GCF
ACDEB

출력

1
99437

예제 입출력 3

입력

1
2
3
4
5
6
7
8
9
10
11
10
A
B
C
D
E
F
G
H
I
J

출력

1
45

예제 입출력 4

입력

1
2
3
2
AB
BA

출력

1
187

코드(파이썬)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
change = dict()
num = 9

n = int(input())
lines = [list(input().rstrip()) for _ in range(n)]
tmp_sum = {k:0 for k in sum(lines, [])}

for line in lines:
    for i in range(len(line)):
        tmp_sum[line[i]] += 10**(len(line)-i-1)

for ch, _ in sorted(tmp_sum.items(), key=lambda x: -x[1]):
    change[ch] = str(num)
    num -= 1

print(sum([int(''.join([change[ch] for ch in line])) for line in lines]))


특이사항

  • 풀이과정
    • lines 리스트에 각 단어를 저장함
    • tmp_sum 딕셔너리에 각 단어를 키로 초기화
    • 단어의 각 문자를 자릿수만큼 곱해서 tmp_sum 딕셔너리에 저장
    • tmp_sum 딕셔너리를 value(문자의 우선순위)별로 정렬한 다음 change 딕셔너리에 9, 8, 7, … 순서대로 저장
    • lines 리스트의 각 단어를 change 딕셔너리를 이용해 숫자로 변환하고 이를 더함

참고문헌

-

This post is licensed under CC BY 4.0 by the author.

백준 11000번 강의실 배정

백준 9465번 Stickers

Comments powered by Disqus.