본문 바로가기
알고리즘 문제/프로그래머스_Lv2 도장깨기

[프로그래머스] n진수 게임

by 스코필 2024. 2. 28.

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/17687

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

  1. 숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, 열번째 사람은 9를 말한다.
  2. 10 이상의 숫자부터는 한자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫자리인 1, 열두번째 사람은 둘째 자리인 0을 말한다.

사람들은 좀 더 난이도를 높이기 위해 이진법에서 십육진법까지 모든 진법으로 게임을 진행해보기로 했다. 튜브는 자신이 말해야 하는 숫자를 미리 출력하는 프로그램을 만들려고 한다. 튜브의 프로그램을 구현하라.

입력 형식

진법 n, 미리 구할 숫자의 갯수 t, 게임에 참가하는 인원 m, 튜브의 순서 p 가 주어진다.

  • 2 <= n <= 16
  • 0 < t <= 1000
  • 2 <= m <= 100
  • 1 <= p <= m

출력 형식

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

 

풀이

튜브가 말해야 하는 숫자를 알기 위해 필요한 총 문자열의 길이는 t * m 이므로, 

n진수로 변환하는 함수를 통해, 총 문자열의 길이가 t * m이 될 때까지

0부터 시작하여 1씩 늘려가며, 위 조건(문자열의 길이가 t * m)을 충족할 때까지 반복한다.

그 후, p와 m을 통해 슬라이싱하여, 말해야하는 숫자를 출력한다.

 

✅ Code - 성공

def solution(n, t, m, p):
    dict = {10: 'A', 11: 'B', 12: 'C', 13:'D', 14:'E', 15:'F'}
    
    # n진수로 변환하는 함수     
    def change_t_num(num):
        t_num = ''
        while num > 0:
            if num % n >= 10:
                t_num = dict[num % n] + t_num
            else:
                t_num = str(num % n) + t_num
                
            num //= n
            
        return t_num
    
    total_t_num = '0'
    speak_num = 1
    while len(total_t_num) < t * m:
        total_t_num += change_t_num(speak_num)
        speak_num += 1
    
    answer = total_t_num[(p-1) : t * m : m]
    
    return answer