본문 바로가기

문제풀이

[프로그래머스] Level1 3진법 뒤집기 (파이썬)

문제 설명

자연수 n이 매개변수로 주어집니다. 

n을 3진법 상에서 앞뒤로 뒤집은 후,

이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항

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

입출력 예

n result
45 7
125 229

 


나의 풀이 (전체 코드)

def solution(n):
    answer = []
    sum = 0
    while(n != 0):
        answer.append(n%3)
        n = n // 3
    
    answer.reverse()
    for i in range(len(answer)):
        sum += answer[i] * (3**i)
    
    return sum

 

처음 문제를 접하고 나서 3진법이란 게 있나?라는 생각을 짧게 했다

 

간략한 3진법?

우선 문제를 풀기 전에 위의 사진처럼 예시가 적용되도록 간단한 표를 메모장에 작성하였다.

 

while(n != 0):
        answer.append(n%3)
        n = n // 3

 

우선 주어진 매개변수 자연수 n이 0이 아닐 때만 계산되도록 반복문을 선언해준다.

그다음 answer라는 리스트에 n을 3으로 나눈 나머지값(%)를 삽입해주고, n은 n으로 나눈 몫으로 설정한다.

 

만약 예시처럼 45가 주어졌다면,

 

① answer 라는 리스트의 첫 번째 인자는 45%3의 값인 0이 삽입되고, n의 값은 45를 3으로 나눈 몫인 15로 설정된다.

② answer 라는 리스트의 두 번째 인자는 15%3의 값인 0이 삽입되고, n의 값은 15를 3으로 나눈 몫인 5로 설정된다.

③ answer 라는 리스트의 세 번째 인자는 5%3의 값인 2가 삽입되고, n의 값은 5를 3으로 나눈 몫인 1로 설정된다.

④ answer 라는 리스트의 네 번째 인자는 1%3의 값인 1이 삽입되고, n의 값은 1을 3으로 나눈 몫인 0으로 설정된다.

 

※ 최종적으로 answer라는 리스트는 [0, 0, 2, 1]로 설정되었다. 

 

주어진 문제에서는 n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 해야 하기 때문에 

 

answer.reverse()

 

reverse() 함수를 사용하여 순서를 뒤집어준다.

 

위에서 계산했던 answer 리스트 [0, 0, 2, 1]의 값은 reverse() 함수를 통하여 [1, 2, 0, 0]으로 바뀌게 된다.

 

for i in range(len(answer)):
   sum += answer[i] * (3**i)

 

그 뒤부터는 반복문을 통하여 계산해주면 된다.

 

마지막은 return 해주면 정답!