124 나라의 숫자 : 3진법

solee·2022년 8월 16일
0

Python

목록 보기
8/16
post-thumbnail

프로그래머스 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12899



방향은 잘 잡았는데, 마지막 한 발자국을 못 가서 혼자서는 통과하지 못했다. 시간 제한을 걸어뒀으니 어쩔 수 없지만 조금만 더 치열하게 고민했다면 좋았을 걸 싶어서 아쉬운 마음에 포스팅을 남긴다.



문제 설명

n은 5억 이하의 자연수고, 테스트 케이스는 네 개다.





풀이

일단 생각난 건 3진법이었다. 10진법 예시로 힌트를 주기도 하고 0, 1, 2 숫자 세 개를 이용하니 1, 2, 4 숫자 세 개를 이용하는 3진법을 활용하면 되겠구나 싶었다.

def solution(n):
    answer = ""
    while n:
        temp = str(n%3)
        if temp == "0":
            temp = "4"
        elif temp == "1":
            temp = "1"
        elif temp == "2":
            temp = "2"
        answer = temp + answer
        n //= 3
        
    return answer

그래서 이렇게 작성해 보았다. 먼저 temp에 n을 3으로 나눈 나머지를 str로 변환해 저장하고, 그 temp에 따라 숫자를 저장해서 3진수로 변환 > 바로 124진수로 변환한다는 생각이었다.
그런데 잘 되지 않았다.

테스트 케이스에서 1,2,4는 통과하지만 3이 실패하는 거였다.

print()를 찍어 보니 4가 출력된 후에 1이 붙어서 나오고 있었다. 계산해 보니까, 3을 3으로 나눠서 딱 떨어지면 나머지는 0이고(0일 때는 4를 출력하니까 4) 몫이 1이 되어 한번 더 while문을 돌기 때문에 앞에 1이 붙어 14가 되는 거였다. 3진법인 경우에는 그렇게 돌아서 10이 되는 게 맞는데, 지금은 124나라의 숫자기 때문에 그렇게 되면 안 되는데!

n에서 -1을 빼거나, if문을 걸어 answer[-1]이 "4"일 때에는 break로 넘긴다거나, and 조건도 걸어서 이것저것 해 봤는데 이 마지막 관문을 넘을 수가 없었다.



정처기며 스터디며 정신이 없어서 오랜만에 코테를 푸니까 이렇게 바보가 된 건가 싶어서 허망하게 다른 풀이를 살펴보는데.... 정말 한 발자국만 더 가면 되는 거였다!

# 내가 참고한 풀이
def solution(n):
    res = ''

    while n > 0:
        temp = 4 if n % 3 == 0 else n % 3
        res = str(temp) + res
        n = (n//3) - 1 if temp == 4 else n//3

    return res

단순한 한 발자국은 아니긴 하지만 ㅎㅎ...
temp는 삼항연산자로 짧게 처리하고, str 형변환을 나중에 해 준다.


포인트는 N 계산이었는데, temp가 4일 때, 즉 n이 3으로 나누어 떨어질 때에는 123이 아니라 124이므로 몫이 1 남아 한번 더 계산을 하지 않아도 되는 상태라는 뜻이므로 그 때에만 -1을 해 주고 아닐 때에는 그냥 3으로 나눈 몫만 변수 n에 재할당해주면 된다.





너무 아쉽고 허망했다. 으앙!!!!
아예 감을 못 잡았으면 우와! 이런 게 생각을 못 했구나! 했을텐데 진짜 손에 잡기 일보직전이었구나 싶으니까 딱 이런 기분이 됐다 ㅠㅠ 그렇지만 예전에는 이만큼도 못 했겠지? 다음에 이 포스팅을 봤을 때엔 아 이걸 못 했었구나~ 했으면 좋겠다. 아니 그렇게 될 예정임~

profile
DA DA DA

0개의 댓글