본문 바로가기

카테고리 없음

[백준 1036번] 36진수 (Python3)

import sys
input = sys.stdin.readline
from collections import deque
n36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def caldiff(num):
  L = len(num)
  for i in range(L):
    n = int(num[L-i-1],36)
    diff[n] += (35-n)*(36**i)

def make36(x):
  if x == 0:
    return 0
  dq = deque()
  while x:
    dq.appendleft(n36[x%36])
    x //= 36
  return "".join(dq)

N = int(input())

SUM = 0
diff = [0]*36

for i in range(N):
  num = input().strip()
  SUM += int(num,36)
  caldiff(num)
diff.sort(reverse=True)

K = int(input())
for i in range(K):
  SUM += diff[i]

print(make36(SUM))

다른 언어는 어떤식으로 작동하는지 모르겠지만 파이썬은 36진수 >> int로의 변환을 지원해서 한결 쉽게 푼 것 같다.

 

알고리즘을 요약하면,

1. 입력값이 주어지면 입력값과, 입력값을 정수형으로 전환한 후 총합을 저장한다.

2. 입력값에 대해서 각 자릿수마다 (Z(=35)와의 차이) * (36^차수) 를 diff 리스트에 저장한다.

3. diff 리스트를 내림차순으로 정렬, K번만큼 diff값을 총합에 더한다.

4. 총합을 36진수로 변환하고 출력한다.

 

참고로 36진수 >> 정수의 변환은 지원하지만 정수 >> 36진수의 변환은 파이썬에서 지원하지 않아 코드로 직접 짜야한다. 이때 주의할 점이 숫자가 0인 경우 0을 출력해야하는데 아무것도 출력하지 않으면 안된다. (이거때문에 한번 틀렸다)

 

 

오늘의 교훈) 파이썬 짱