CodingTest/programmers

[프로그래머스/Programmers] n진수 게임 - Python

ukunV 2021. 11. 12. 18:15

Link

 

코딩테스트 연습 - [3차] n진수 게임

N진수 게임 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0

programmers.co.kr

 

Solution

해당 문제를 풀기 위해서는 10진수를 n진수로 변환하는 방법을 필수 적으로 알아야한다.

다음은 기본적인 10진수 -> n진수 변환법이다.

# n: 진수 변환을 위하는 10진수
# q: 변환을 원하는 진수

def solution(n, q):
    b = ''

    while n > 0:
        n, mod = divmod(n, q)
        b += str(mod)

    return b[::-1]

필자의 풀이는 해당 변환법을 활용하여 해결하였다. 또한 문제의 입력 형식인 진법 n, 구할 숫자의 갯수 t, 게임에 참여하는 인원 m, 튜브의 순서 p의 관계를 파악하는것에 중점을 두었다.

파악한 관계는

  1. 필요한 전체 답의 길이: t * m
  2. for i in range(p - 1, len(full), m)

이다.

1번 관계의 경우 의미를 파악해보면 숫자의 갯수 t와 참여하는 인원 m을 곱한 길이만큼만 0부터 해당 진수로 문자열을 구해주면 된다.

2번 관계의 경우 1번에서 구한 문자열에서 해당하는 순서의 문자만 뽑아내는 for문이다. p - 1은 순서를 인덱스에 맞춰 -1을 해준것이고 간격을 m만큼 둠으로써 해당 순서에 알맞은 문자만 뽑아낼 수 있다.

def ten_to_n(n, l):
    result = '0'

    num_arr = ['A', 'B', 'C', 'D', 'E', 'F']

    b = 1
    while len(result) < l:
        ts = ''
        tb = b

        while tb > 0:
            tb, mod = divmod(tb, n)

            if mod >= 10:
                ts += num_arr[mod - 10]
            else:
                ts += str(mod)

        result += ts[::-1]
        b += 1

    return result

def solution(n, t, m, p):
    answer = ''

    full = ten_to_n(n, t * m)

    for i in range(p - 1, len(full), m):
        answer += full[i]

        if len(answer) == t:
            return answer
🔑 key point: 10진수 -> n진수 변환법
📌 Tip: t * m, for(p - 1, len(full), m)