[Python]월간 코드 챌린지 시즌 1: 3진법 뒤집기

코드싸개·2021년 1월 17일
0

programmers

목록 보기
11/20

문제 설명

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

제한사항

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

입출력 예

nresult
457
125229

입출력 예 설명

입출력 예 #1

  • 답을 도출하는 과정은 다음과 같습니다.
n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
45120000217

따라서 7을 return 해야 합니다.

입출력 예 #2

  • 답을 도출하는 과정은 다음과 같습니다.
n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
1251112222111229

따라서 229를 return 해야 합니다.

내 코드

def ternary(number):
    q, r = divmod(number, 3)
    n = '012'[r]
    return ternary(q) + n if q else n

def solution(n):
    ter_num = ternary(n)
    rev_num = int(str(ter_num)[::-1])
    return int(str(rev_num), 3)

머리 식히려고 도전한 문제였는데 생각보다 오래 걸려서 놀랬다.(아마 재귀함수가 익숙치않아서 그런거같다.)
위에 ternary 함수는 3진법으로 바꿔주는 함수이고 솔루션에서 rev_num 부분은 str형으로 바꿔서 앞뒤 번전을 시키고, 3진법 수를 10진법으로 바꾸는 방식으로 해결하였다.

다른 사람의 생각

def solution(n):
    answer = 0
    cnt = 1
    a = ''
    while n>0:
        a+=str(n%3)
        n = n//3
    print(a)
    for b in range(len(a),0,-1):
        answer += (int(a[b-1])*cnt)
        cnt *= 3
    return answer

나머지 정리를 이용해서 찾는 방법이다. 아무래도 이런 문제는 함수를 정의해서 푸는게 빠르게 풀 수 있을 것 같다.

profile
데이터 분석 공부용 벨로그

0개의 댓글