[프로그래머스] 124 나라의 숫자 / 파이썬

124 나라의 숫자

문제 설명

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

  1. 124 나라에는 자연수만 존재합니다.
  2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
    예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
10진법 124 나라 10진법 124 나라
1 1 6 14
2 2 7 21
3 4 8 2
4 11 9 24
5 12 10 41

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

제한사항

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

입출력 예

n result
1 2
2 2
3 4
4 11

풀이

  • 다음에 들어올 값은, 자릿수가 하나 작은 값의 맨 앞에 1, 2, 4중 하나가 붙음
  • 예: 두자릿 수
    • 11, 12, 14는 [1, 2, 4]에 1이 붙은 경우
    • 21, 22, 24는 [1, 2, 4]에 2가 붙은 경우
    • 41, 42, 44는 [1, 2,, 4]에 4가 붙은 경우
    • 즉, 2자리수의 값은 1자리수의 값 앞에 [1, 2, 4]가 순차적으로 붙은 것임
  • 단점 : 모든 경우를 찾으나 속도가 느림
def solution(n):  
    Table = ['1', '2', '4']  
    while len(Table) < n:  
        start = ((3 **len(Table[-1]) -1) // 2) - 1  
        end = ((3 ** (len(Table[-1])+1) -1) // 2) - 1  
        for i in ['1', '2', '4']:  
            for j in range(start, end):  
                Table.append(''.join([i, Table[j]\))

            if len(Table) == n:
                break
    return Table[n-1]
  • 두자리 수는 [1, 2, 4]를 중복해서 뽑아서 나열한 경우임.
  • 즉, 각 자리수에 올 수 있는 값은 1, 2, 4중에 하나임 (3x3)
  • 예: 두자릿 수
    • [1, 2, 4] x [1, 2, 4] = [11,12,14,21,22,24,41,42,44]
  • product를 이용해서 두자리 수의 모든 케이스를 찾고 정렬한 다음에, n의 위치를 반환
    • n의 위치는 참고로 이전의 한자리 수의 위치까지 고려해야 함.
    • 즉, n = 10이라는 것은 1의 자리수 3개를 빼고 남은 나머지인 7이 됨 (41)
  • 속도는 빨라졌으나 그대로 속도에서 걸림
from itertools import product  
def solution(n):  
    # 자릿수 반환  
    lengthn = 1  
    start = 0  
for i in range(1, n):  
    start = ((3 ** i -1) // 2)  
    end = ((3 ** (i+1) -1) // 2)

    if (n >= start) & (n < end):
        lengthn = i
        break

if n <= 3: 
    start = 1

sol = sorted(list(map(''.join, product(['1', '2', '4'], repeat=lengthn))))
return sol[n-start]

다른 사람의 풀이

  • 들어오는 n에 대해서 바로 변환을 진행
  • 3진수의 개념을 이용해서 변환
 def solution(n):
    num = ['1','2','4']
    answer = ""


    while n > 0:
        n -= 1
        answer = num[n % 3] + answer
        n //= 3

    return answer
 def solution(n):
    if n<=3:
        return '124'[n-1]
    else:
        q, r = divmod(n-1, 3) 
        return solution(q) + '124'[r]

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

댓글(0)

Designed by JB FACTORY