알고리즘/문제풀이

[백준 - Gold IV] 단어 수학 - 1339

skyriv 2025. 5. 29. 14:36

[백준 - Gold IV] 단어 수학 - 1339

 

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

 

 

문제 설명

 

1. 영어로 이루어진 N개의 단어가 제공

2. 영어 글자에 숫자(1~9)를 배정하고 합을 계산

3. 이때 숫자의 합이 최대가 되었을 때 해당 합을 출력

 

입력값 

N : 단어의 개수

S : N개의 단어 

 

출력값

res : 주어진 단어의 최댓값

 

핵심 로직 = 가중치

  • 가장 큰 자릿수에 존재하는 글자부터 가장 큰 숫자 9 배정
  • 자주 등장하는 글자도 포함해서 계산해야 함

 

풀이 코드

 

오답 코드

heapq, 우선순위 큐를 사용해서 자릿수에 대한 가중치만 생각한 코드, 자주 등장하는 글자를 체크하지 못한 것이 오답의 원인

import heapq

n = int(input())
s = [input() for _ in range(n)]
alpa = []
dic = {}
for i in s:
    l = len(i)
    for j,k in enumerate(i):
        heapq.heappush(alpa,(-10**(l-j),k))
i = 9
while alpa:
    a,c = heapq.heappop(alpa)
    if c not in dic:
        dic[c] = i
        i-=1

res = 0
for i in s :
    temp =''
    for j in i:
        temp+=str(dic[j])
    res+=int(temp)
print(res)

 

정답 코드

딕셔너리 사용을 통해 해당 글자의 자릿수와 빈도수를 체크

from collections import defaultdict

n = int(input())
s = [input() for _ in range(n)]
alpa = defaultdict(int)
for i in s:
    l = len(i)
    for j, char in enumerate(i):
        alpa[char] += 10 ** (l - j - 1) # 자릿수로 가중치 덧셈, 할당

sortAlpa = sorted(alpa.items(), key=lambda x: -x[1])
# print(sortAlpa)

dic = {}
num = 9
for char, _ in sortAlpa:
    dic[char] = num
    num -= 1

res = 0
for i in s:
    temp = ''
    for j in i:
        temp += str(dic[j])
    res += int(temp)

print(res)