[python]3진법 뒤집기

eunvi·2021년 12월 27일
0

프로그래머스

목록 보기
24/25
post-thumbnail

월간 코드 챌린지 시즌1>3진법 뒤집기

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


[제한사항]

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

[입출력 예]

[입출력 예 설명]

입출력 예 #1

  • 답을 도출하는 과정은 다음과 같습니다.
  • 따라서 7을 return 해야 합니다.

입출력 예 #2

  • 답을 도출하는 과정은 다음과 같습니다.
  • 따라서 229를 return 해야 합니다.

나의 풀이

생각해보기!

num = 0
n3 = [] # 3진법 리스트
  • num : n을 3진법으로 나타낼 때의 자릿수
  • n3 : 3진법으로 표현한 수를 담기 위한 리스트
# 1
    
for i in range(1,18): 
	if n >= 3**i:
		num += 1
	else:
		break
  • #1) 3의 1제곱부터 17제곱까지 n과의 대소비교를 통해 3진법으로 나타낼 때의 자릿수를 num으로 받았다.

    • 3의 17제곱은 129,140,163 으로 n이 1 이상 100,000,000 이하인 자연수라는 제한사항을 만족시키기 위해 설정한 범위다. (아래의 다른 사람의 풀이를 보면 이렇게 안풀었다.. 어떻게든 풀고 싶었던 마음에....)
    • 예를 들어, n = 45 이면 num = 3
      27 (= 3^(3)) < 45 < 81 (= 3^(4))
    • 45를 3진법으로 나타내면 1200(3진법)인데 num이 3인 이유는 아래 #2에서 범위를 0까지 고려하기 때문이다.
# 2
    
for i in range(num,-1,-1):

	if n >= 2*(3**(i)):
		n3.append(2)
		n -= 2*(3**(i))
        
	elif n >= 3**(i):
		n3.append(1)
                n -= 3**(i)
                
        else:
            n3.append(0)
  • #2) 3진법은 2, 1, 0 으로 표현되므로 num값에 따라 자릿수에 맞춰 2, 1, 0을 n3에 append()해준다.

    • range(num,-1,-1)은 num부터 0까지 내림차순으로 i를 반환한다.
    • num = 3일 때, 3, 2, 1, 0 순으로 반환된다.
    • n = 45일 때, n3 = [ 2, 1, 0, 0 ]
# 3
    
answer = 0 # 앞뒤 반전한 후 3진법>10진법으로 표현한 수
   
for i in range(len(n3)):
    answer += (n3[i])*(3**(i))
  • #3) n3의 앞 원소부터 3의 0제곱, 1제곱 ,,, len(n3)제곱까지 answer에 더해주면 3진법을 10진법으로 앞뒤 반전하여 표현한 수를 얻을 수 있다.


전체 코드는 다음과 같다.

def solution(n):
    num = 0
    n3 = []
    
    # 1
    for i in range(1,18): 
        if n >= 3**i:
            num += 1
        else:
            break

    # 2
    for i in range(num,-1,-1):
        if n >= 2*(3**(i)):
            n3.append(2)
            n -= 2*(3**(i))
        elif n >= 3**(i):
            n3.append(1)
            n -= 3**(i)
        else:
            n3.append(0)
      
      
    answer = 0
    
    # 3
    for i in range(len(n3)):
        answer += (n3[i])*(3**(i))
        
    return answer

푸는 데에 시간이 오래 걸렸다. 지쳐서 풀이를 포스팅하지 못한 걸 폴더를 정리하면서 알았다😅

순위도 캡처 못했다.. 힘들어도 당일 포스팅 잊지말기❗

다른 사람의 풀이 #1

def solution(n):
    tmp = ''
    while n:
        tmp += str(n % 3) # 나머지 
        n = n // 3 # 몫

    answer = int(tmp, 3) 
    return answer

참고하세요!

  • 나눗셈의 나머지 활용
  • 문자열을 3진법을 10진수로 표현 → int() 함수
  • tmp에 앞뒤 반전한 3진법으로 표현된다.
    • ex) n=45, tmp=0021

다른 사람의 풀이 #2

def solution(n):

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

참고하세요!

  • 앞뒤 반전한 3진법을 표현하는 방법은 위의 다른 사람의 풀이 #1과 동일하다.
  • for문으로 3의 제곱을 cnt 변수를 활용해 10진법으로 나타냈다.
profile
please study

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN