프로그래머스(Programmers) : n진수 게임 - python 풀이

JISU LIM·2023년 9월 6일

Algorithm Study Records

목록 보기
54/79

🚀 문제 요약

자기 차례의 숫자를 말하면 되는 문제이다. 1부터 수가 증가하는데, 두 자리 수 이상이 되면 수를 떨어뜨려서 말해야 한다. 근데 이걸 최대 16진수 버전으로 한다 했을 때, 말해야 하는 수(문자)를 모두 구해놓자.

✏️ 접근법

  • 10진수를 n진수로 변환하는 함수 정의
    • 최대 16진수까지 변환할 수 있으므로 알파벳 F까지 추가하는 로직 구현해야 함
  • 문자열의 길이가 (m*t)이 될 때까지 n진수 이어 붙이기
    • 튜브 순서가 t번 돌 수 있을 때까지
  • 튜브의 순서대로 문자 출력 [::p], 개수 오버하는 경우 t개까지만 출력

🔠 풀이 코드

def de2n(num: int, base: int) -> str:
    """
    n을 base진수로 변환하는 메서드
    이 떄 base는 최대 16이다.
    """
    if num == 0:
        return "0"

    result = ""

    while num > 0:
        rem = num % base
        num //= base

        if rem == 15:  # 최대 16진수 알파벳 처리 로직
            result += "F"
        elif rem == 14:
            result += "E"
        elif rem == 13:
            result += "D"
        elif rem == 12:
            result += "C"
        elif rem == 11:
            result += "B"
        elif rem == 10:
            result += "A"
        else:
            result += str(rem)

    return result[::-1]


def solution(n: int, t: int, m: int, p: int) -> str:
    """
    n : 변환할 진수
    t : 미리 구할 숫자의 갯수
    m : 게임에 참가하는 인원
    p : 튜브의 순서
    """
    tmp = ""
    num = 0
    while len(tmp) < (m * t):  # 튜브 순서가 t번 돌 수 있을 때까지
        tmp += de2n(num, n)  # n진수로 변환하여 이어붙임
        num += 1
    return tmp[p - 1 :: m][:t]  # 오버하는 경우 t개까지만 출력

🙏 문제 접근 방법 및 코드에 대한 피드백과 질문은 환영입니다!

✏️ Algorithm Study

본 문제의 다른 풀이 및 피드백, 전체 문제 풀이 순서는 위 알고리즘 스터디 Repository에서도 확인 가능합니다.

profile
Grow Exponentially

0개의 댓글