int의 숨겨진 기능(10진법)

Created by
  • 서경태
Created at
answer = int('1200', 3) print(answer)
answer은 값은?
바로 45다.
int의 숨겨진 기능은 10진법으로 변환해주는 것이다.
내가 푼 문제는 다음과 같다.
❓
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
n (10진법)
n (3진법)
앞뒤 반전(3진법)
10진법으로 표현
45
1200
0021
7
위 표처럼 정수 45를 입력하면 3진법으로 바꾸고 반전시킨 다음 다시 10진법으로 표기하는 것이다. 정수를 3진법으로 변환하는 방법은 각 자리수를 3으로 계속나누고 나머지를 역순으로 표기하는 것이다. 그러니 정수를 3으로 나눈 나머지를 그대로 10진법으로 표기하면 된다.
def solution(n): n_lst = [] while n >= 3: x = n % 3 n_lst.append(x) n = n // 3 if n < 3: n_lst.append(n) m_lst = [] for i in range(1, len(n_lst)+1): m_lst.append(n_lst[-i] * (3**(i-1))) return sum(m_lst)
10진법으로 다시 변환하는 과정에서 i를 조작하는데 꽤 많은 시간을 잡아먹었다. 실제 변환하는 것과 달리 역순을 건너뛰어서 반대로 곱해야하 했기 때문이다.
하지만 int를 잘 사용하면 이런 복잡한 생각을 할 필요가 없다.
def solution(n): tmp = '' while n: tmp += str(n % 3) n = n // 3 answer = int(tmp, 3) return answer
int로 10진법을 구하는 코드인데 특성을 정말 잘 사용했다.
먼저, while n: 에서 n이 존재하는 한(True) 반복문이 계속 도는데 0이 되면 False를 반환하는 특성을 사용했다.
그리고 int(tmp, 3)을 사용해 간단한게 3진법의 수를 10진법으로 만들었다. 하지만 여기서 유의할 점은 첫번째 인자가 문자열로 들어와야한다. 만 3진법의 수 1200을 10진법으로 바꾸고싶다면 아래와 같이 작성해야한다.
int(1200, 3) #1200이 정수이므로 작동하지 않는다. int('1200', 3) #숫자를 넣더라고 문자열로 표기해야 작동한다. >> 45
이유는 숫자는 이미 정수(10진법)로 인식되어 변환하지 않고 문자열로 2진법, 3진법 등을 표기하기 때문이다.