프로그래머스 링크: 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에 재할당해주면 된다.
너무 아쉽고 허망했다. 으앙!!!!
아예 감을 못 잡았으면 우와! 이런 게 생각을 못 했구나! 했을텐데 진짜 손에 잡기 일보직전이었구나 싶으니까 딱 이런 기분이 됐다 ㅠㅠ 그렇지만 예전에는 이만큼도 못 했겠지? 다음에 이 포스팅을 봤을 때엔 아 이걸 못 했었구나~ 했으면 좋겠다. 아니 그렇게 될 예정임~