728x90
반응형
https://www.acmicpc.net/problem/1339
1339번: 단어 수학
첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대
www.acmicpc.net
import sys
from string import ascii_uppercase #대문자가 담겨있는 리스트
n = int(sys.stdin.readline())
arr = []
dic = {}
v_dic = {}
num = [0,1,2,3,4,5,6,7,8,9]
for _ in range(n):
arr.append(sys.stdin.readline().rstrip())
for i in ascii_uppercase:
dic[i] = -1 #할당값을 담아줄 대문자 딕셔너리
v_dic[i] = 0 #우선순위를 저장할 대문자 딕셔너리
for i in arr:
i = list(i)
for j in range(len(i)):
v_dic[i[j]] = v_dic[i[j]] + 10**(len(i)-(j))
v_dic = sorted(v_dic.items(), key = lambda x:x[1])
while num:
x,y = v_dic.pop()
dic[x] = num.pop()
ans = 0
for i in arr:
i = list(i)
for j in range(len(i)):
i[j] = str(dic[i[j]])
x = "".join(i)
ans = ans + int(x)
print(ans)
그리디 알고리즘의 핵심은 정렬과 기준이라고 생각한다.
뭐를 기준으로 오름차순 or 내림차순 정렬을 할지 정해주고 나면 나머지는 구현 문제다.
최적해를 구하는 문제라서 당연한 얘기다.
해당 문제는 알파뱃을 각 숫자로 치환해서 합을 가장 크게 하는 문제다.
당연히 큰 숫자가 큰 값을 가질수록 유리할 것이다.
98765가 9x10^5 + 8x10^4 + 7x10^3... 이런 식으로 표현되는 걸 생각해보면 된다.
v_dic 딕셔너리에 해당 알파벳의 자릿수의 합의 값(우선순위 값)을 넣어준다.
예를 들어 ABCD 와 BEF 가 있으면 A는 10^3, B는 10^2 + 10^2, C = 10 이런 식으로 말이다.
우선순위 값이 같은 애들은 답을 출력할 때 더해지기 때문에 어떤 곳에 더 큰 수를 할당할지는 고려하지 않아도 된다.
가장 큰 값을 가지는 v_dic부터 큰 수를 할당해준다.
dic에는 해당 알파벳에 할당되는 실제 값을 반복문을 통해서 넣어주면 된다.
마지막에 입력받은 문자열을 정수로 치환해서 모두 더해주면 끝!
728x90
반응형
'Algorithm & Data Structure' 카테고리의 다른 글
백준 - 9466번(DFS, cycle 생성) (0) | 2022.07.23 |
---|---|
백준 - 2239,2580번(백트래킹, 스도쿠) (0) | 2022.07.23 |
백준 - 11399번(그리디) (0) | 2022.05.28 |
백준 - 2839번(그리디) (0) | 2022.05.28 |
백준 - 1753번(다익스트라,우선순위 큐) (0) | 2022.05.22 |