- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/68935

 

Level 1 문제이고, 스스로 푼 문제다!

 

문제에서 헷갈렸던 게, 3진법 진행 순서와 배열의 진행 순서가 반대라는 것이다. 

배열에서는 가장 왼쪽이 0 인덱스지만, 3진법에서는 가장 오른쪽에 있는 수는 3 ** 0 을 곱해야하기 때문이다

 

1. 

몇 번까지 진행해야하는지 모르니까 while문으로 n을 나눌 수 있는 가장 큰 3의 제곱수를 찾은 다음 

거꾸로 for문을 진행하면서 n의 3진법을 three 리스트에 구현한다 

 

2. 

three 배열을 거꾸로 진행하면서 flipped 배열에 추가한다 (.sort(reverse = True) 는 1200 을 0021이 아닌 2100으로 바꿔서 안된다)

 

3. 

flipped의 원소들 또한 거꾸로 진행하면서 3의 제곱수를 곱해서 다 더한 값을 answer로 반환한다 

 

일일이 순서대로 진행했는데, 뭔가 큐나 스택의 특성을 이용하면 더 빨리 풀 수 있을 것 같다 

 

- 정답 풀이 :

def solution(n):
    answer = 0 
    mul= 0 
    while True:
        if n // (3 ** mul) == 0:
            mul -= 1 
            break
        mul += 1
    three = []
    
    for i in range(mul, -1 , -1):
        num = n // (3 ** i)
        three.append(num)
        # 제곱수의 몫까지 곱해서 빼주기 
        n -= (3 ** i) * num
        
    flipped = []
    for i in range(len(three) - 1, -1, -1):
        flipped.append(three[i])
    
    for i in range(len(three) - 1, -1, -1) :
        answer += flipped[i] * (3 ** (len(three) -1 - i))
    
    return answer

+ Recent posts