정리

백준 1339번: 단어 수학 본문

Programming/백준 BOJ

백준 1339번: 단어 수학

H.J.Park 2021. 1. 11. 06:21

백준 1339번: 단어 수학

 

1339번: 단어 수학

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

www.acmicpc.net

 

백트래킹을 활용한 풀이도 있지만 그보다 덧셈식을 활용한 풀이가 더 좋다고 생각하여 덧셈식을 활용하여 풀었다

  • N = 2, GCF + ACDEB 와 같은 입력이 주어진다고 가정하자
  • 각 알파벳과 자릿수를 계산하면 ((G * 100) + (C * 10) + (F * 1)) + ((A * 10000) + (C * 1000) + (D * 100) + (E * 10) + (B * 1)) 와 같이 나타낼 수 있다
  • 계수를 알파벳에 따른 내림차순으로 정리하면 (A * 10000) + (C * 1010) + (D * 100) + (G * 100) + (C * 10) + (E * 10) + (B * 1) + (F * 1) 와 같이 나타낼 수 있다
  • 계수가 큰 알파벳부터 9부터 0까지 수를 부여하면 된다

아래는 파이썬 코드이다

 

import operator
n = int(input())
a = {}
for i in range(n):
tmp = list(input())
for j in range(len(tmp)):
# 딕셔너리 a에 이미 알파벳이 있다면 기존 value에 더한다
if tmp[j] in a.keys():
a[tmp[j]] += 10 ** (len(tmp) - j - 1)
# 딕셔너리 a에 알파벳이 없다면 새로 key를 추가하고 value에 더한다
else:
a[tmp[j]] = 10 ** (len(tmp) - j - 1) # 자릿수 계수는 len(tmp) - j - 1 이다
rep = sorted(a.items(), key=operator.itemgetter(1)) # 자릿수 계수가 큰 알파벳 순으로 정렬한다
ans = 0
num = 9
for i in range(len(rep) - 1, -1, -1):
ans += num * rep[i][1] # 자릿수 계수를 곱
num -= 1
print(ans)
view raw BOJ_1339.py hosted with ❤ by GitHub

'Programming > 백준 BOJ' 카테고리의 다른 글

백준 19699번: 소-난다!  (0) 2021.01.31
백준 1669번: 멍멍이 쓰다듬기  (0) 2021.01.13
백준 1251번: 단어 나누기  (0) 2021.01.11
백준 1654번: 랜선 자르기  (0) 2021.01.05
백준 1789번: 수들의 합  (0) 2020.12.25
Comments