프로그래머스/Level1
[월간 코드 챌린지 시즌 1 / 프로그래머스] 68935번 : 3진법 뒤집기
ydin
2022. 8. 24. 11:39
- 문제 : 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