반응형
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))
반응형