코딩

[BOJ] 1132 합 (Python)

척척석사아님 2024. 2. 27. 18:31
728x90
from collections import defaultdict
N = int(input())
d = defaultdict(int)
for i in range (0,12):
    d[chr(i + 65)] = 0 #각각의 인덱스 저장

cant_zero = []
for i in range (0,N):
    s = input() #입력되는 문자
    n = len(s)
    for j in range (0,n):
        if j == 0:
            cant_zero.append(s[j])
        d[s[j]] += 10 ** (n - 1 - j)

spell = []
for i in range (0,12):
    if d[chr(i + 65)] != 0:
        spell.append([chr(i+65) , d[chr(i + 65)]])
spell.sort(reverse = True, key = lambda x: x[1])
can_zero = []
revised = []

for i in range (0,len(spell)):
    if spell[i][0] in cant_zero:
        revised.append(spell[i])
    else:
        can_zero.append(spell[i])

if len(revised) <= 9:
    for i in range (0,len(can_zero)):
        revised.append(can_zero[i])
    if len(revised) <= 9:
        for j in range (0,9):
            revised.append([0,0])
            
revised = revised[0:9]
revised.sort(reverse= True, key = lambda x : x[1])

ans = 0
for i in range (0,9):
    ans += revised[i][1] * (9-i)
print(ans)

 

골드 3 문제였는데, 꽤 그래도 재밌게 풀은 느낌이 든다.

 

도중 몇가지 작업이 필요가 없을 수도 있었는데, 일단은 굉장히 빠르게 해결할 수 있었으니 ... 일단은 만족하는 것으로.

 

 

가장 중요한 아이디어 중 하나는, 0이 될 수 없는 문자들을 미리 분류해두고 우선순위에 둘 필요가 있는 것이다.

 

이 알고리즘에서는 알파뱃들을 총 2번에 걸쳐서 필터링을 하였다.

 

첫번째로, spell 리스트에서의 for문인데, 여기서 0이 될 수 없는 것들을 우선적으로 revised라는 리스트에 넣어줄 필요성이 있었다.

 

두번째로, if len(revised)에서, 길이를 강제로 9로 만들어주는 방법을 취하였다. 

 

꽤 재밌었던 문제 같았다.

'코딩' 카테고리의 다른 글

[BOJ] 백준 18111 마인크래프트 Python  (0) 2024.02.29
[BOJ] 2252 줄 세우기 Python  (0) 2024.02.28
[BOJ] 백준 14502 연구소 Python  (0) 2024.02.23
[BOJ] 1158 요세푸스 수열  (1) 2024.02.09
[BOJ] 28449 누가 이길까  (1) 2024.02.07