문제

https://programmers.co.kr/learn/courses/30/lessons/12899

풀이

1, 2, 4 로 이루어진 3진수 숫자로 10진수를 변환시키는 문제.
단, 우리가 아는 8진수 16진수는 0~7, 0~15로 이루어져있는데,
124 나라의 3진수는 1, 2, 4 로 이루어져 있다.
이 때문에 4, 1, 2 로 변환하여 시도하는 것이 계산에 편하다.

8 / 3  = 2...2 -> 22
9 / 3  = 3...0 -> 24
10 / 3 = 3...1 -> 41

여기서 두 가지 규칙을 찾아야 하는데,
첫 번째는 몫이 달라져도 곧바로 10의자리 값이 변하지 않고,
두 번째는 몫을 한 번 더 나눌 수 있으면 몫을 나눈 값의 나머지가 대입된다는 점이다.

첫 번째 규칙에 대해 이야기해보자면,
몫이 3으로 딱 떨어졌음에도 124 나라의 숫자는 여전히 2 로 시작하고,
몫 3에 나머지가 생기고 나서야 4 시작으로 바뀌었다.
우리가 아는 8진수, 16진수는 0부터 n-1 까지지만, 124 나라의 3진수는 0부터 시작이 아니기 때문이다.
그래서 나머지가 0이라면 몫에서 1을 까줘야 원하는 값을 얻을 수 있다.

두 번째 규칙은 10을 나누고 생긴 몫을 다시 나눠보면
몫 1에 나머지 0으로 떨어지는데, 이러면 첫 번째 규칙에 의해 결국 4가 대입되고,
몫이 0으로 변하기 때문에 41로 마무리가 된다.

def solution(n):
    nara = ['4', '1', '2']
    answer = ''
    while n :
        answer = nara[n % 3] + answer
        if n % 3 == 0 : n = n // 3 - 1
        else : n = n // 3

    return answer

더 나은 풀이

def solution(n):
    numbers = ['4', '1', '2']
    answer = ''
    while n:
        answer = numbers[n % 3] + answer
        n = n // 3 - (n % 3 == 0)
    return answer

코드가 굉장히 유사한데, 루프에 속한 두 번째 줄이 눈에 띈다.
(n % 3 == 0) 참이라면 1, 거짓이라면 0이 반환될테니까…
ㅋㅋㅋ.. 파도파도 끝이 없다 정말.

댓글남기기