본문 바로가기

3. 알고리즘/프로그래머스

[python] 17. 3진법 뒤집기(feat. divmod 함수)

728x90

문제 설명

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

 

제한사항

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

 

입출력 예

n result
45 7
125 229

 

입출력 예 설명

n (10진법) n (3진법) 앞뒤반전(3진법) 10진법으로 표현
45 1200 0021 7

 


나의 코드

def solution(n):
    answer = ''
    result = 0
    
    while n >= 3:  #n을 3으로 나눈 나머지를 num에 저장하고, 몫은 n에 다시 저장하는 while문을 수행한다.
        num = n % 3
        n //= 3
        answer += str(num)  #answer에 붙여준다. while문을 실행하면 역순으로 저장되기 때문에 reversed를 따로 수행할 필요는 없다.
    answer += str(n)  #마지막으로 나온 나머지를 다시 한번 붙여준다.
    
    for u, v in enumerate(answer):  #3진법 수를 다시 10진법으로 변환시키는 과정/ 인덱스를 이용했다.
        result += int(v) * (3 ** (len(answer)-u-1))
    return result

 

다른 풀이

def n_ary(n, base):  #10진법 함수를 3진법으로 바꿔주고, 역순으로 바꿔주는 함수
    result = []
    while n > 0:
        n, r = divmod(n, base)
        result.append(r)
    return ''.join(map(str, reversed(result)))

def solution(n):
    b3 = n_ary(n, 3)
    b3 = b3[::-1]  #다시 역순
    return int(b3, 3)  #10진수로 변환

* divmod: 정수를 나눈 몫과 나머지를 구하는 함수

* int(value, base): value에는 정수로 변환할 값, base에는 밑을 입력해준다.

value에 문자형이 들어가면 알아서 base에 입력된 진법을 인식하고 10진수으로 변환해준다.

728x90