프로그래밍-학습기록/코딩테스트

프로그래머스 | level 1 | python | 3진법 뒤집기

leesche 2021. 3. 1. 17:31

프로그래머스 | level 1 | python | 3진법 뒤집기

나의 풀이

def solution(n):
    answer = []
    while n != 0:  # 3진법 적용하여 거꾸로 표현
        remainder = n % 3  # 나머지
        if remainder == 0:
            answer.append(0)
        else:
            answer.append(remainder)
        n = n // 3

    base = 1 # 밑
    sum = 0
    while answer:
        sum += answer.pop() * base
        base *= 3
    return sum

3진법을 다루는 간단한 문제이다.

다시 알고리즘 문제를 풀며 실력을 끌어올리리라, 다짐하며 시작했다. 안 풀어 봤던 level 1 문제를 발견해 풀었다. 편리한 언어의 대명사 파이썬이라 3진법 만드는 것도 라이브러리에 있을까? 하고 찾아봤지만, 없었다. 그래서 while문으로 구현했다. 그리고 그 이전에 수를 특정 진법에 따라 나열해야 해서 문자열과 배열 중에 배열 자료구조를 택했다(배열의 append와 pop으로 풀 수 있지 않을까? 하는 애매한 생각에).

그리고 문제에 10진법 수를 3진법으로 만든 다음 '뒤집으'라고 했으니 reverse() 메서드가 필요하지 않을까 했는데, 3진법으로 만드는 과정에서 이미 뒤집혀 나온 상태였다. 수고가 줄었다! 아니, 내가 구현한 프로그램의 결과를 스스로 예측하지 못했으니 오히려 시간 낭비했다.

여하튼 뒤집혀 나온 것을 3진법의 규칙에 따라 다시 10진법 수로 만들어주면 됐다. 이것도 역시 반복문을 사용하면 됐다. 리스트의 오른쪽 끝에서부터 계산을 하면 되므로, 메서드 pop()을 사용하기에 좋았다. 그리고 곱해줄 진법의 '밑'을 base=1로 정했다. 그래서 answer이 텅 빌 때까지 pop()연산을 한 다음 그 반환 값과 밑을 곱하여 합했다.

필요했거나 살펴봤던 Python 기능

  • some_list.reverse() → 리스트를 뒤집지만 반환값이 없다.
  • reversed(some_list) → listreverseiterator 객체를 반환한다. list()로 감싸주면 뒤집힌 리스트를 얻을 수 있다.