자연수 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