728x90
1036번: 36진수
첫째 줄에 수의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에 수가 주어진다. N은 최대 50이고, 수의 길이도 최대 50이다. 마지막 줄에 K가 주어진다. K는 36보다 작거나 같은 자연수 또는 0이다.
www.acmicpc.net
🤔 문제분석
파이썬에서 36진수로 변환해주는 기능이 있어서 더욱 쉽게 풀 수 있었습니다. 자리수와 알파벳을 고려한 가중치를 모두 구하고 가중치가 가장 높은 수를 K개 선택하여서 K개를 모두 Z로 바꿔준 후 모든 문자열의 10진수로 변환하여 모두 더한 뒤 다시 36진수 자리로 변환합니다.
💻 코드
import sys
from collections import defaultdict
VALUE_36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
input = sys.stdin.readline
def to_36(number):
d = list(VALUE_36)
a, b = number // 36, number % 36
w = d[b]
return to_36(a) + w if a != 0 else w
value = defaultdict(int)
N = int(input())
char_list = []
for _ in range(N):
char = str(input().strip())
char_list.append(char)
K = int(input())
for c in char_list:
for j in range(len(c)):
# 자리에따른 가중치를 계산한다. (문자열을 뒤집은 다음 가중치를 더한다. j는 0부터 시작하기때문)
value[c[::-1][j]] += 36 ** j
for key in value.keys():
# 알파벳 가중치를 계산해준다.
value[key] = value[key] * (35 - int(key, 36))
value = sorted(value.items())
# 가중치를 내림차순으로 정렬 한다. ( Z로 바꾸면 항상 값이 커지기때문에 가장 큰값을 바꿔야 합이 커진다. )
value.sort(key= lambda x:-x[1])
for i in value[:K]:
for j in range(len(char_list)):
# 해당 알파벳을 Z로 replace해준다.
char_list[j] = char_list[j].replace(i[0], "Z")
sum_number = 0
# 모든 값을 더해준다.
for char in char_list:
sum_number += int(char, 36)
# 더한값을 알파벳으로 변환해준다.
print(to_36(sum_number))
🎯 피드백 및 개선사항
10진수에서 36진수로, 36진수에서 10진수로 변환하는 과정이 이문제의 핵심이라고 생각합니다. 파이썬에서 만약 이 기능을 제공하지 않았더라면 그 변환하는 로직이 이 문제의 핵심일 것이라고 생각합니다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1022번 : 소용돌이 예쁘게 출력하기 (0) | 2024.03.03 |
---|---|
[백준] 2931번 : 가스관 (0) | 2024.03.03 |
[백준] 18809번 : Gaaaaaaaaaarden (0) | 2024.03.02 |
[백준] 21610번 : 마법사 상어와 비바라기 (0) | 2024.02.29 |
[백준] 19237번 : 어른 상어 (0) | 2024.02.28 |