FrontEnd
Javascript
Diary
ML
CS
Django
Algorithm
AWS
Co-Work
HTML
CSS
Python
React
ReactNative

#38 알고리즘 연습 - 124 나라의 숫자(Python)

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다. 124 나라에는 자연수만 존재합니다. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

10진법 124 나라 10진법 124 나라
1 1 6 14
2 2 7 21
3 4 8 22
4 11 9 24
5 12 10 41

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

제한사항

n은 500,000,000이하의 자연수 입니다.

입출력 예

n result
1 1
2 2
3 4
4 11

문제풀이
1,2,4 라는 숫자로 표현하는것 외에는 3진수와 표현이 같은 방식이다
하지만 이를 시각적으로 확인을 해보면 1 - 1 2 - 2 3 - 4 4 - 11 5 - 12 6 - 14 7 - 21 8 - 22 9 - 24
3으로 나눈 나머지에 따라 마지막 자리수가 결정되는 것을 알수 있다. 그리고 7의 경우 7 = 3*2 + 1 이라서 마지막자리에 1이 붙고 몫인 2에 대해서는 2가 붙는다.
예외적으로 3의 배수인 경우 3으로 나눈 몫-1 에 대응되는 수를 가져온다

내 풀이 🏆

def solution(n):
    answer = ''     #124로 구성된 수를 더하기 위해 문자열을 준비한다
    ans_dict = {0: 4, 1: 1, 2: 2}   #나머지에 대응되는 수를 뽑아오기 위해 dict을 사용했는데 list로 해도 무방할것 같다
    while True:                     #beak조건을 만족하기 전에는 지속적으로 n을 연산하여 update해줍니다
        answer = str(ans_dict[n % 3]) + answer   #answer += str()을 안해준 이유는 update되는 n%3에 대해 추가되는 수는 앞쪽에 더해져야하므로
        if n % 3 == 0:                  #만약 n이 3의 배수이면 n//3이 아니라 n//3-1을 저장해줘 1,2,4 숫자와 제대로 대응시켜준다
            n = n//3 - 1
        else:                           #그게 아니라면 n을 n//3으로 update해준다.
            n = n//3
        if n == 0:                      #그리고 반복문에서 n이 0이면 더 이상 연산을 진행하지 않아도 되므로
            break                       #break해준다
    return answer

다른 풀이 🏆

def change124(n):
    num = ['1', '2', '4']    #대응되는 수를 list의 index로 가져올 수 있게 한다.
    answer = ""
    while n > 0:             #n이 0이면 while문이 끝나게 한다

        n -= 1               #나머지에 대응해보면  0 : 4 , 1: 1 , 2 : 2 인데
                             #n -1 을 해주고 list의 원소순서를 고쳐 코드를 if문으로 상황에 따라 나누지 않아도 되도록 했다
        answer = num[n % 3] + answer  
        n //= 3
    return answer