728x90
진법 이용
#3진법으로 접근 (1,2,4) -> (0,1,2)
#1 2 10 11 12 20 21 22 100 101 102 110 111 112 120 <-real(3)
#1 2 4 11 12 14 21 22 24 41 42 44 111 112 114 <- 124 world
#0 1 2 00 01 02 10 11 12 20 21 22 000 001 002 <- ideal(3)
#10 11 12 100 101 102 110 111 112 120 121 122 1000 1001 1002 < idea
#11 12 13 111 112 113 121 122 123 131 132 133 1111 1112 1113 < idea
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <- real (10)
#+3 +3 +3 +9 +9 +9 +9 +9 +9 +9 +9 +9 +27 +27 +27 <-add (bias)
def solution(n):
rev = []
tmp_n = n
world = ['1','2','4']
answer = ''
total_len_num = 0 #전체 자릿수
while(tmp_n):
total_len_num += 1
tmp_n = (tmp_n-1)//3
n += 3**(total_len_num) #자리수가 늘어난 숫자
while(n):
res = n % 3
n = (n-1)//3
if res == 0: # 3의배수
rev.append(3)
else:
rev.append(res)
rev.reverse()
print(rev)
rev = list(map(lambda x: x-1, rev))[1:]
print(rev)
for r in rev:
answer += world[r]
return answer
진법 변환은 다음과 같은 코드로 구현 할 수 있다
tmp = string.digits+string.ascii_lowercase #추후 16진법 등을처리하기 위해 0,1,~9,a,b,~z
def convert(num, base) :
q, r = divmod(num, base)
if q == 0 :
return tmp[r]
else :
return convert(q, base) + tmp[r]
print(convert(10,3))
>> 101
divmod함수 이용
def change124(n):
if n<=3:
return '124'[n-1]
else:
q, r = divmod(n-1, 3)
return change124(q) + '124'[r]
베스트 풀이
def change124(n):
num = ['1','2','4']
answer = ""
while n > 0:
n -= 1
answer = num[n % 3] + answer
n //= 3
return answer
- 1을 빼주는 이유는 124 마을은 0부터 시작하는 것이 아니므로 하나를 빼준다
728x90
'코테준비 > Programmers' 카테고리의 다른 글
소수 찾기(순열 이용) (0) | 2022.09.19 |
---|---|
더 맵게(heap 이용) (0) | 2022.09.19 |
멀쩡한 사각형(최대공배수 이용) (0) | 2022.09.19 |
행렬 테두리 회전하기(copy매소드) (0) | 2022.09.19 |
올바른 괄호(lambda이용) (0) | 2022.09.19 |