algorithm/문제

[Python]백준 1339번/단어수학/greedy

유랄라- 2022. 2. 22. 12:04
반응형

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

 

1339번: 단어 수학

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

www.acmicpc.net

⚡️ 문제 설명

단어 수학 문제는 N개의 단어로 이루어져 있으며, 각 단어는 알파벳 대문자로만 이루어져 있다.

이때, 각 알파벳 대문자를 0부터 9까지의 숫자 중 하나로 바꿔서 N개의 수를 합하는 문제이다.

같은 알파벳은 같은 숫자로 바꿔야 하며, 두 개 이상의 알파벳이 같은 숫자로 바뀌어지면 안 된다.

예를 들어, GCF + ACDEB를 계산한다고 할 때,

A = 9, B = 4, C = 8, D = 6, E = 5, F = 3, G = 7로 결정한다면, 두 수의 합은 99437이 되어서 최대가 될 것이다.

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

 

⚡️ 해결 방법

이 입력을 예시로 설명해보면

2
GCF
ACDEB

 

1. dictionary에 각 자릿수를 10의 n승으로 저장

for word in words:
    length=len(word)
    for idx,ele in enumerate(word):
        if(ele in dic):
            dic[ele] += pow(10,length-idx-1)
        else:
            dic[ele] = pow(10,length-idx-1)

2. 이 dictionary를 value 값을 기준으로 정렬한다.

dic=sorted(dic.items(),key=lambda x:x[1], reverse=True)

3. 각 자리에 9부터 차례로 곱해준 것을 결과에 더한다.

num=9
result=0
for d in dic:
    result += num*d[1]
    num -=1

⚡️ 코드

import sys

input = sys.stdin.readline
n = int(input())
words = []
for _ in range(n):
    words.append(input().strip())

dic=dict()
for word in words:
    length=len(word)
    for idx,ele in enumerate(word):
        if(ele in dic):
            dic[ele] += pow(10,length-idx-1)
        else:
            dic[ele] = pow(10,length-idx-1)

# dic을 value기준으로 정렬
dic=sorted(dic.items(),key=lambda x:x[1], reverse=True)

num=9
result=0
for d in dic:
    result += num*d[1]
    num -=1
print(result)
반응형