Programmers Coding Quiz #27 3진법 뒤집기(Fail)

김기욱·2021년 2월 5일
0

코딩테스트

목록 보기
27/68

문제 설명

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

제한사항

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

입출력 예

nresult
457
125229

입출력 예 설명
답을 도출 하는 과정은 다음과 같습니다.

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

따라서 7이 return

풀이

# 첫 번째 방법(재귀함수사용)
def ternary(n, result):
    a = divmod(n, 3)
    if a[0] == 1 or a[0] == 2:
        result = result + str(a[1]) + str(a[0]) 
        return result
    else:
        result = result + str(a[1]) 
        return ternary(a[0], result)
        
def solution(n):
	return int(ternary(n, ''), 3)

# 두 번째 방법(while문 사용)
def solution(n):
    result, number = '', n
    while True :
        a = divmod(number, 3)
        if a[0] == 1 or a[0] == 2:
            result = result + f'{a[1]}' +  f'{a[0]}'
            break
        else:
            result = result + f'{a[1]}'
        number = a[0]
    return int(result, 3)
  1. 두 방법 모드 구현방식은 비슷합니다. 역순하는 과정을 굳이 할 필요없이 나머지를 뒤에다가 붙여버리고 맨 마지막에 3진법 문자열을 int를 사용해 10진법으로 바꿔줍니다.
  2. 제 방법은 실제 프로그래머스에 적용시 테스트코드 1번에서 각각 런타임 오류/시간초과가 발생합니다. 재귀가 너무 깊어지거나, while문이 너무 오래돌거나 둘 중 하나인 것 같은데 사실 잘 모르겠습니다.

다른풀이

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

    answer = int(tmp, 3)
    return answer

간단하게 생각하는 사고는 늘 어려운 것 같습니다.
결론적으로 푸는 방식은 비슷하나 while문 처리가 매우 직관적입니다.
divmod를 쓰지 않았는데 더 깔끔하네요.

profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.

0개의 댓글