민식이는 수학학원에서 단어 수학 문제를 푸는 숙제를 받았다.
단어 수학 문제는 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 복사
2
AAA
AAA
예제 출력 1 복사
1998
예제 입력 2 복사
2
GCF
ACDEB
예제 출력 2 복사
99437
예제 입력 3 복사
10
A
B
C
D
E
F
G
H
I
J
예제 출력 3 복사
45
예제 입력 4 복사
2
AB
BA
예제 출력 4 복사
187
입출력을 살펴 보겠습니다.
주어진 단어들의 합이 최대가 될려면 어떻게 해야 할까요?
자릿수가 가장 높은 위치에 있는 알파벳에 가장 큰 숫자 9를 넣으면 되지 않을까요?
문제에서 예시가 있습니다.
GCF + ACDEB를 보시면 A = 9, C = 8, …을 지정하는 것을 볼 수 있습니다.
가장 높은 자릿수의 숫자가 커야 가장 큰 수를 가질 수 있기 때문에 각 알파벳의 자릿수를 기준으로 정렬을 하면 될 것 같습니다.
GCF
에서 G
는 100의 가중치, C
는 10의 가중치, F
는 1의 가중치를 가집니다.import sys
N = int(sys.stdin.readline().strip())
words = [sys.stdin.readline().strip() for _ in range(N)]
weights = {}
for word in words:
length = len(word)
for i, char in enumerate(word):
power = 10 ** (length - i -1)
if char in weights:
weights[char] += power
else:
weights[char] = power
weights = sorted(weights.items(), key=lambda x:x[1], reverse=True)
assign_numbers = {}
num = 9
for char, _ in weights:
assign_numbers[char] = num
num -= 1
total = 0
for word in words:
num_value = 0
for char in word:
num_value = 10 * num_value + assign_numbers[char]
total += num_value
print(total)
가중치 계산:
정렬:
숫자 변환 및 합산:
- .
총 시간 복잡도: 이며, , 이므로 매우 효율적입니다.
이 문제는 그리디 알고리즘 예제로, 각 알파벳의 자릿수에 따라 가중치를 부여하고, 가중치가 높은 알파벳에 높은 숫자를 배정하는 방식으로 해결했습니다. 이를 통해 주어진 단어의 합의 최댓값을 효율적으로 계산할 수 있었습니다.
특히, 자릿수 가중치를 누적하는 아이디어와 이를 정렬한 뒤 숫자를 배정하는 과정이 핵심이었습니다. 시간 복잡도는 입력 크기에 비례하여 로 매우 효율적이며, 주어진 문제의 제한 조건 내에서 빠르게 동작합니다.
이번 문제를 통해 그리디 알고리즘의 기본 원리인 "현재 상황에서 최선의 선택을 반복적으로 수행"하는 방법을 명확히 이해할 수 있었습니다. 앞으로 이와 비슷한 자원 할당 문제에서도 유사한 접근 방식으로 해결할 수 있을 것입니다.
전체 코드는 다음 링크에서 확인할 수 있습니다.
읽어주셔서 감사합니다.