[프로그래머스]2018 KAKAO BLIND RECRUITMENT [3차] n진수 게임 - Python

mincheol2·2022년 7월 25일
0

알고리즘

목록 보기
3/4

문제

문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/17687#


주의해야할 점은 t가 0~t까지가 아니라 튜브가 몇번 말해야하는지를 나타내는 변수이다!!
(이것 때문에 30분을 삽질함...)

해설

아이디어

  1. n진수로 바꾸는 함수를 만들자
  2. 튜브가 t번째 말할 때 최종 인덱스가 어디인지를 찾자
  3. 만들어진 문자열에서 튜브가 말하는 인덱스를 찾아서 뽑아주자(최종 인덱스까지)

10진수 to n진수 변환

divmod재귀함수 를 이용하여 n진수의 str으로 반환하는 함수이다.

def convert_number(n, num): 
    txt = "0123456789ABCDEF" # 16진수까지의 index
    quot, remain = divmod(num,n) # 몫 , 나머지
    
    # 몫이 1 이상이라면 몫을 재귀함수로 보내고 나머지를 txt에서 찾아준다.
    # 목이 0이 되면 txt에서 찾아준다.
    # 결과적으로 재귀함수로 들어간 몫이 앞에 계속 붙어주면서 return을 하기 때문에 n진법으로 변환된다.
    return convert_number(n, quot) + txt[remain] if quot else txt[remain]

전체 코드

# 진수 변환
 def convert_number(n, num): 
    txt = "0123456789ABCDEF"
    quot, remain = divmod(num,n)
    return convert_number(n, quot) + txt[remain] if quot else txt[remain]
 
# 튜브의 인덱스 리스트
def make_tube_index(m, p, tube_max):
    tube_index = [i for i in range(p-1, tube_max, m)]
    return tube_index

def solution(n, t, m, p):
    answer = '' # 최종답
    converted = '' # n진수로 변환되어 쭉 나열된 str 
    tube_max = m*t # 튜브의 마지막 인덱스
    
    # 최종 인덱스 범위까지 포함하는 converted
    i = 0 
    while len(converted)-1 < tube_max:
        converted += convert_number(n,i)
        i+=1
    
    # 튜브가 말하는 인덱스
    tube_index = make_tube_index(m,p,tube_max)
    
    # 튜브의 순서에 맞는 것만 answer에 추가
    for i in tube_index:
        answer += converted[i]
        
    return answer
profile
옹오옹오오오옹ㅇㅇ

0개의 댓글