자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
n | result |
---|---|
45 | 7 |
125 | 229 |
답을 도출하는 과정은 다음과 같습니다.
n (10진법) | n (3진법) | 앞뒤 반전(3진법) | 10진법으로 표현 |
---|---|---|---|
45 | 1200 | 0021 | 7 |
따라서 7을 return 해야 합니다.
from math import pow
def solution(n):
answer = 0
temp = []
while n!=0:
if n < 3 :
temp.append(n)
n = 0
elif n % 3 == 0 :
temp.append(0)
n = n/3
else:
temp.append(n%3)
n = int(n/3)
for i in range(len(temp)):
answer += pow(3,len(temp)-i-1) * temp[i]
return answer
저는 Python으로 이 문제를 풀어보았습니다. 문제를 보고 먼저 든 생각이 매개변수 n
을 3진법으로 변환하는 반복문을 만들고 그것을 담을 list
temp
를 만드는 것이였습니다. while
문을 사용하여 매개변수 n
이 0
이 될때 까지 나누면서 나머지값을 temp
에 append()
를 사용하여 하나씩 추가하였습니다.
리스트에 append()
함수를 사용하면 리스트 맨뒤에 추가하게 되므로 앞뒤가 반전된 순서로 추가됩니다. 이렇게 되면 3진법을 반전시키는 과정을 생략할수 있습니다.
temp
가 완성되면 이제는 answer
을 계산해줘야합니다. 저는 math
모듈에서 pow
함수를 가져와서 제곱을 계산했습니다. pow(3,len(temp)-i-1)
은 3진법을 10진법으로 변환하기 위한 식으로 list
의 첫번째 수는 3의 len(temp)-0-1
이 되므로 [0,0,2,1]
을 예로 들면 4-0-1
이 됩니다. 즉, 3의 3승을 0과 곱한 값을 answer
와 더합니다.
이렇게 풀어 테스트는 모두 통과했지만 사실 그렇게 효율적이진 않은 것 같다. 반복문이 2개가 사용되었는데 1개로 바꾸는 방법도 존재할 것 같다.