자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
n은 1 이상 100,000,000 이하인 자연수입니다.

예를 들어, 45를 3으로 몫이 0이 될때까지 계속 나누게 되면 아래와 같이 나오게 된다
45 / 3 = 15 ··· 0
15 / 3 = 5 ··· 0
5 / 3 = 1 ··· 2
1 / 3 = 0 ··· 1
=> 나머지: 0 0 2 1
이 0 0 2 1은 프로그래머스의 입출력 예시에 따르면 3진법에서 앞뒤를 반전한 값이다. 이후, 이 값을 10진수로 나타내면 문제에서 원하는 결과가 나오게 된다.
n이 0보다 큰 경우, 즉 3으로 나눌 수 있는 경우 반복적으로 3으로 n값을 나눈다. 이때 나머지는 reminder변수에 저장하여 배열arr에 append()를 통해 값을 추가한다. 그리고 n값은 3을 나눈 몫으로 다시 선언해준다.
while (n > 0):
reminder = n % 3 # 나머지
n = n // 3 #몫으로 n값이 갱신
arr.append(reminder)
그리고 이렇게 reminder값이 저장된 arr의 값을 출력할 경우 [0 0 2 1]과 같이 나오기 때문에 이를 0021로 나타내기 위해 join을 사용한다. 그리고 이를 다시 10진법으로 나타내야 하므로 int()를 이용한다.
#리스트 형태 없애고 일반 문자열로 나타내기
num_10 = str(''.join(str(i) for i in arr))
answer = int(num_10,3) # 10진법으로
int(string, base)
print(int('101',2)) #101값이 2진수임을 의미
이는 해당 변수 string이 base진수임을 의미한다. 즉, base가 2이면 해당 string값은 2진수임을 의미한다. 내가 입력했던 코드 (아래 코드)의 경우에도 해당 함수를 사용하기 위해 num_10을 string값으로 변환하였다.
num_10 = str(''.join(str(i) for i in arr))
answer = int(num_10,3)
def solution(n):
answer = 0
arr = []
# 3진법 (앞뒤 반전)
while (n > 0):
a = n % 3
n = n // 3
arr.append(a)
#리스트 형태 없애고 일반 문자열로 나타내기
num_10 = str(''.join(str(i) for i in arr))
answer = int(num_10,3) # 10진법으로
return answer
우선 아래처럼 tmp=''로 해놓으면 join함수 없이 바로 나머지값만을 문자열로 출력할 수 있다. 나는 배열을 이용했는데 이럴때는 그냥 빈 문자열을 할당하는 것이 코드 한 줄이라도 더 줄이고 효율적으로 할 수 있을 것 같다.
def solution(n):
tmp = ''
while n:
tmp += str(n % 3)
n = n // 3
answer = int(tmp, 3)
return answer