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

신남·2023년 1월 17일

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)

0개의 댓글