프로그래머스 2018 카카오 - n진수게임 Python

Jamwon·2021년 7월 14일
0

알고리즘

목록 보기
14/18
post-thumbnail

문제링크

2레벨 문제!!

문제

숫자 0부터 시작해서 사람들이 차례대로 말하는데 10부터는 1을 말하고 다음 사람은 0을 말하고 11이면 1을 말하고 다음사람은 1을 말하는 식으로 10이상부터는 한자리씩 끊어서 말한다.

이 숫자들을 주어진 n진법으로 바꿔서 말한다.

입력

n : 진법
t : 미리 구할 숫자의 갯수
m : 게임에 참가하는 임원
p : 튜브의 순서

출력

주어진 순서대로 튜브가 말할 숫자를 String으로 합쳐서 한개의 String을 출력하면 된다.

해결법

사실상 문제에서 물어보는것은 n진법으로 바꾸는법을 물어보는 문제인것 같다.

그럼 진수 변환 함수를 만들어 보자 !

string 모듈을 이용해서
0~9까지 A부터 Z까지의 (16진수라 Z까지는 필요없지만) string을 만들어 준다.

그러고 그 숫자를 n진수이면 n으로 나눠주며 진수 변환을 진행한다.

재귀함수로 몫이 0일때 까지 계속 진행한다.

import string

tmp = string.digits + string.ascii_lowercase
def convert(num, base):
    q, r = divmod(num, base)
    if q == 0:
        return tmp[r]
    else:
        return convert(q, base) + tmp[r]

이렇게 10진수의 수를 n진수로 바꿔주는 함수가 완성되었다.

n진수 게임이 진행될 수를 구한다! 튜브가 마지막으로 말하는 숫자 까지만 진행되면 되기때문에

(t-1)*m +p 가 마지막 튜브가 구할숫자의 순서이다.

for문을 이 마지막 번호까지 돌리면서 temp list에 n진수로 변환시킨 10진수를 list로 나눠서 하나씩 추가해준다.

그리고 answer 에 튜브의 차례일때 마다 해당하는 temp list의 숫자를 더해준다!!

그러면 정답!

import string

tmp = string.digits + string.ascii_lowercase


def solution(n, t, m, p):
    ## n: 진법 t: 미리 구할 숫자의 갯수 , m 게임에 참가하는 인원, p 튜브의 순서

    answer = ''
    temp = []
    last_num = (t - 1) * m + p
    for i in range(last_num):

        if len(temp) <= last_num:
            for j in range(len(list(convert(i, n)))):
                temp.append(list(convert(i, n))[j])
    for i in range(p - 1, last_num, m):
        answer += temp[i]
    # print(temp)
    # print(answer)
    return answer.upper()


def convert(num, base):
    q, r = divmod(num, base)
    if q == 0:
        return tmp[r]
    else:
        return convert(q, base) + tmp[r]


solution(2, 4, 2, 1)
# solution(16, 16, 2, 1)

문제 해결!!! n진수로 바꾸는 법을 잘 알아두자 !
String 모듈을 활용해서 0~9까지 a~z까지 문자열을 만들수 있다는 것도

profile
한걸음씩 위로 자유롭게

0개의 댓글