1. 문제 설명

여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는데, 규칙은 다음과 같다.

 

- 숫자를 0부터 시작해서 차례대로 말한다. 첫번째 사람은 0, 두번째 사람은 1, ... 열번째 사람은 9를 말한다.

- 10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉, 열한 번째 사람은 10의 첫 자라인 1, 열 두번째 사람은 둘째 자리인 0을 말한다.

 

이렇게 게임을 진행할 경우,

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, ...

순으로 숫자를 말하면 된다.

 

이진법에서 십육진법까지 모든 진법으로 게임을 진행하기로 했다.

예를 들어 이집수로 게임을 진행한다면,

0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, ...

순으로 숫자를 말하면 된다.

 

 

 

2. 입출력 형식

- 입력 : 진법 n, 미리 구할 숫자의 개수 t, 게임에 참가하는 인원 m, 튜브의 순서 p

- 출력 : 튜브가 말해야 하는 숫자 t개를 공백 없이 차례대로 나타낸 문자열. 단, 10 ~ 15는 각각 대문자 A ~ F로 출력한다.

 

 

 

3. 코드

def jinbub(num, jinsu):
    jin = ' 0'

    for i in range(1, num+1):
        changed = []

        while i != 0:
            left = i % jinsu

            if left >= 10:
                if left == 10:
                    left = 'A'
                elif left == 11:
                    left = 'B'
                elif left == 12:
                    left = 'C'
                elif left == 13:
                    left = 'D'
                elif left == 14:
                    left = 'E'
                elif left == 15:
                    left = 'F'

            changed.append(str(left))
            i = i // jinsu

        temp = ''.join(list(reversed(changed)))
        jin += temp
        
    return jin
    
def solution(n, t, m, p):
    jin_str = jinbub(t*m, n)
    
    i = 1
    answer = ''
    
    if m == p: p = 0
    
    while len(answer) < t:
        if i % m == p:
            answer += jin_str[i]
        i += 1
    
    
    return answer

 

 

 

4. 설명

(1) jinbub(num, jinsu)

미리 숫자들을 진법으로 변환시켜두어야 하는데, 몇 개를 미리 만들어둘지가 고민 되었다.

 

jin_str = jinbub(t * m, n)

 

이렇게 최대 (말해야 하는 숫자의 개수) * (참가하는 인원) 만큼 진법 변환 결과를 구해두고,

함수에서 반환 받아서 말해야 하는 순서에 맞게 문자열에 추가만 해주도록 한다.

 

Python에서 제공하는 진법 변환 함수는 bin(), oct(), hex()로 2, 8, 16진수 변환만을 제공한다. 따라서 이 문제에서는 3진법, 4진법 등 다양하게 요구하므로 직접! 구현해주어야 한다.

 

 

몫과 나머지를 각각 구해가면서 하나씩 배열에 나머지들을 저장한다. (만약 10 이상의 나머지일 경우, 해당하는 문자로 바꾸기)

그리고 그 배열을 reverse 해서 순서를 바꿔주고 문자열로 (join) 만들어준다.

 

이때, 나는 공백을 두고 0으로 초기화 ( jin = ' 0' ) 했는데, 그 이유는 게임에서 말하는 순서가 0번째부터가 아니라 1번째부터이기 때문이다.

 

 

 

(2) solution(n, t, m, p)

진법 변환 함수 호출해서 문자열을 받아 오고, 말해야 하는 숫자의 개수가 채워질 때까지 while문을 반복한다.

 

인덱스 1부터 시작하고, 만약 3명의 인원에서 3번째 순서인 경우 몫과 나머지로 차례를 판단하기 어렵기 때문에, 미리 m == p 일때 p=0으로 만들어주었다.

 

하나씩 더한 문자들의 문자열을 반환하면 끝!

 

 

 

+ Recent posts