https://www.acmicpc.net/problem/1339
공부날짜 : 2022.11.14
정답 참조 여부 : O
알파벳 대문자로 이루어진 단어에서 각 알파벳의 숫자에 따라 단어의 값이 달라진다.
이때 단어의 알파벳을 숫자로 바꿨을 때 단어의 합이 최대가되는 값을 구하는 문제이다.
골드 4라서 쉽게 봤는데 역시 그리디 문제
알면 쉽고 모르면 어렵다.
오랜만에 풀어보는 문제라서 약 1달만 진득하게 생각이 되지않아서 정답을 바로 참고했다.
푸는 방법은 각 알파벳의 점유율? 크기를 구하고 각 크기 순으로 정렬해서 9부터 곱해주는 것 이었다.
참조한 정답에서는 딕셔너리로 값을 정리했는데 나는 리스트를 만들었다.
각 알파벳을 0~25의 숫자로 바꿔줬는데
파이썬의 경우 알파벳을 아스키 코드로 바꿔주는 함수가 따로 있는지 몰라서
int('A')
로 썼다가 오류가 나왔다.
파이썬에서 아스키 코드로 바꿔주는 함수는
ord('A')
이다.
파이썬언어를 배운게 아니라서 자료형의 변환이 어렵긴 하다. 또 입력받은 값을 리스트로 바꿔주면
list(input()) #AAA
#['A','A','A',\n]
의 형태로 저장되었다.
다른 방법을 몰라서 pop(-1)로 처리하긴 했는데
입출력방법과 관련해서 좀 공부해둘 필요가 있어 보인다.
import sys
input = sys.stdin.readline
########################################
#데이터 입력받기
n = int(input())
data = []
#숫자로 바꿔서 저장
for _ in range(n):
input_data = list(input())
input_data.pop(-1)
for alpha in range(len(input_data)):
num = ord(input_data[alpha]) - ord('A')
input_data[alpha] = num
data.append(input_data[:])
########################################
alphabet = [0] * 26
#각 알파벳의 크기를 변환해서 저장
for i in range(n):
for j in range(len(data[i])):
alphabet[data[i][j]] += 10 ** (len(data[i]) -1 - j)
#크기순으로 정렬
alphabet.sort(reverse= True)
answer = 0
temp = 9
#알파벳은 최대 10가지 종류이므로 10까지만 반복
for i in range(10):
answer += alphabet[i] * temp
temp -= 1
print(answer)