갱스터하우스

[Python] Lv1.3진법 뒤집기 본문

코테 문제/프로그래머스

[Python] Lv1.3진법 뒤집기

승갱 2022. 4. 13. 23:18

https://programmers.co.kr/learn/courses/30/lessons/68935

 

코딩테스트 연습 - 3진법 뒤집기

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

programmers.co.kr

 

 

 

 

 

문제 설명

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

 

제한사항

  • n은 1 이상 100,000,000 이하인 자연수입니다.

 

입출력 예

n result
45 7
125 229

 

 

 

입출력 예 설명

입출력 예 #1

  • 답을 도출하는 과정은 다음과 같습니다.
n (10진법) n (3진법) 앞뒤 반전(3진법) 10진법으로 표현
45 1200 0021 7
  • 따라서 7을 return 해야 합니다.

 

입출력 예 #2

  • 답을 도출하는 과정은 다음과 같습니다.
n (10진법) n (3진법) 앞뒤 반전(3진법) 10진법으로 표현
125 11122 22111 229
  • 따라서 229를 return 해야 합니다.

 

나의 접근방법 및 풀이

먼저 내가 생각했을 때 이 문제의 중요한 포인트는 10진법의 수 → 3진법의 순으로 바꾸는 것이다.

3진법으로 변환하는 방법은 정수 n을 3으로 나누어 나머지를 저장하고 3으로 나눈 몫이 0이 될 때까지 반복하는 것이다.

반전된 3진법에서 10진법으로 변환할 때, 10진법으로 변환하기 위해서는 결국 한 번 더 3진법을 반전해야 한다.

3 진법  반전 3진법 반전 3진법 = 원래 3진법

그러니 다시 10진법으로 바꿀 때는 기존의 3진법을 이용하여 바꾸면 된다.

def solution(n):
    answer = 0
    num = ''
    ## 3진법으로 변환
    while( n != 0):
        num += str(n%3)     ## n을 3으로 나눈 나머지를 문자열로 바꿔서 저장
        n = n//3    # 다음을 위해서
    num = num[::-1]		## 반전해야 3진법   
    
    ## 바로 10진수로 바꾸기
    for i in range(len(num)):
        answer += int(num[i])*(3**i)
    
    return answer

 

 

다른 풀이

int() 함수를 이용해서 빠르게 10진법으로 바꿀 수 있는 방법이 있다.         

def solution(n):
    tmp = ''
    while n:
        tmp += str(n % 3)
        n = n // 3

    answer = int(tmp, 3)
    return answer