자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
n은 1 이상 100,000,000 이하인 자연수입니다.
n | result |
---|---|
45 | 7 |
125 | 229 |
def solution(n):
answer = 0
samjin = []
while (n != 0) :
samjin.append(n%3)
n //= 3
for i, v in enumerate(reversed(samjin)) :
answer = answer + (v * 3**i)
return answer
먼저 10진법을 3진법으로 바꾸기 위해 주어진 수를 3으로 나누어 나머지를 samjin
이라는 리스트에 넣고, 또 나눈 몫을 다시 또 3으로 나누어 나머지는 samjin
리스트에 넣는 식으로 n
값이 0ㅣ 될 때까지 while
문을 통해 반복했다. 그렇게 구해지는 배열을 거꾸로 하면 n
을 3진법으로 바꾼 수인데, 문제에서는 3진법을 뒤집은 것을 십진법으로 구하는게 목적이었지만, 3진법을 10진법으로 구할 때 편의를 위해서 다시 reversed()
함수를 통해 samjin
을 뒤집어 사용했다. 거기에 인덱스를 활용해서 쓰기 위해 enumerate()
함수를 써서 samjin
의 첫번째 값이 올때는 3의 i
승으로 해서 인덱스에 따라 곱해지게하였다. 처음에는 어렵게 생각했는데, 풀다보니 더 간단하게 풀 수 있었던 것 같다.
def solution(n):
answer = 0
cnt = 1
a = ''
while n>0:
a+=str(n%3)
n = n//3
for b in range(len(a),0,-1):
answer += (int(a[b-1])*cnt)
cnt *= 3
return answer
마땅히 눈에 띄는 코드가 없어서 가장 좋아요를 많이 받은 코드를 가져왔다. 나와같이 while
문을 사용하였고, a
라는 문자열에 나머지를 구해서 덧붙여주었다. 그리고 a
문자열의 길이 부터 1까지 -1씩 줄어들게 for
문을 돌려서 문자열의 맨 마지막 꺼부터 꺼내어 cnt
를 활용하여 답을 구하였다. 나는 내가 풀었던 방식이 좀 더 이해하기 쉬운 코드이지 않나 하는 생각이 들었다.