알고리즘/수학

[백준]1036 36진수 #그리디#자릿수#정렬

씩씩한 IT블로그 2020. 6. 27. 16:39
반응형

1. 풀이

(1) 각 숫자별(0~35) 자릿수에 의한 값을 저장해놓는 배열을 만든다.

 

ex)

AB

3C

수 (i) 0 1 2 3 4 5 6 7 8 9 10 A B c ... Z
자릿수 값(v[i]) 0 0 0 36 0 0 0 0 0 0 0 36 1 1 0 0

 

(2) 35로 바꿨을 때 가장 차이가 큰 수부터 차례대로 35로 바꾼다.

즉 수가 i이고, 그 수의 자릿수 값이 v[i]일때, (35-i)*v[i] 가 큰 순서대로 값을 바꾼다.

* 그냥 v[i]가 작은것 부터 해서 틀렸음!

 

2. 소스코드

N=int(input())
L=[]
for i in range(N):
    L.append(input())
K=int(input())
digit=[[i,0] for i in range(36)]

def toThree(num):
    if num<10:
        return str(num)
    else:
        return chr(num-10+65)

def toAns(num):
    ans=""
    while(num//36):
        remain=toThree(num%36)
        ans=remain+ans
        num=num//36
    ans=toThree(num)+ans
    return ans


def toDecimal(a):
    try:
        return int(a)
    except:
        return 10+ord(a)-ord("A")

def compare(l):
    return l[1]*35-l[1]*l[0]

# 각 숫자별 크기확안
for word in L:
    size=len(word)
    for i in range(size):
        num=toDecimal(word[size-1-i])
        digit[num][1]+=(36**i)

# 큰순서대로 정렬 후 Z로 바꾸기
digit.sort(key=compare,reverse=True)
#print(digit)
cnt=0
for i in range(36):
    if cnt == K:
        break
    if digit[i][0]!=35:
        digit[i][0]=35
        cnt+=1
#print(digit)

# 10진수 합 구하기
sumDicimal=0
for i in range(36):
    sumDicimal+=digit[i][0]*digit[i][1]


print(toAns(sumDicimal))

 

반응형