본문 바로가기

개발/algorithm

[프로그래머스][level2] [3차] n진수 게임 - python

문제 링크

풀이 

- 수의 범위가 크기 않아서 반복문 사용한 단순 구현으로 풀어보았다.

파이썬은 2진법, 8진법, 16진법은 bin(), oct(), hex() 라는 내장 함수를 사용할 수 있지만 나머지 진법은 직접 구현해줘야했다. 

# 진법에 맞는 숫자로 변환해주는 함수 
def cal(n, q):
    rev_base = ''
    
    while n > 0 :
        n, mod = divmod(n,q)
        
        # 10-15를 문자로 표현하기 위해 
        if mod >= 10 :
        	# 'A'의 아스키 코드 65 
            rev_base += chr(55+mod)
        else:
            rev_base += str(mod)
            
    index = 0
    # 앞에 0 제거하기 위해 뒤에서부터 0이 아닌 숫자 등장 인덱스 저장 
    for i in range(len(rev_base)-1, -1, -1):
        if rev_base[i] != '0':
            index = i 
            break

    return rev_base[index::-1]
    
def solution(n, t, m, p):
    answer = ''
    
    # 현재 순서 
    seq = 1
    # 10진수 숫자
    num = 0
    # 구한 횟수 
    cnt = 0 
    
    while True :
   		# 0 이면 진법 바꿀 필요 x 
        if num == 0:
            if seq == p :
                answer += '0'
                # 구한 횟수 +1 
                cnt += 1 
                if cnt == t :
                    return answer 
            # 순서 + 1
            seq += 1 
        else :    
        	# 진법 변환 
            c_num = cal(num, n)
			
            # 변환한 숫자의 길이만큼 
            for i in range(len(c_num)):
                # 순서 갱신 
                if seq > m :
                    seq = 1 
                
                # 튜브 차례
                if seq == p:
                    answer += c_num[i]
                    # 구한 횟수 + 1 
                    cnt += 1 
                    if cnt == t :
                        return answer 
            	#순서 + 1 
                seq += 1 
                
        # 10진수 숫자 증가 
        num += 1

다른 사람의 코드를 참고하니 재귀 함수를 사용하여 10진수를 n진수로 변환하는 함수로 코드를 훨씬 간단히 할 수 있었다. 

0부터 목표하는 숫자까지 n진법으로 변환해서 저장해 놓고 튜브의 순서에 해당하는 인덱스 값의 원소를 구해주었다. 

# 재귀함수로 10진수 n진수로 변환 
def convert(n, base):
    arr= '0123456789ABCDEF'
    # n을 base로 나눈 몫과 나머지 
    q, r = divmod(n, base)
    if q == 0:
        return arr[r]
    else:
        return convert(q,base) + arr[r]
           
def solution(n, t, m, p):
    answer = ''
    # 숫자 리스트 
    num = ''
    
    for i in range(m*t):
        num += str(convert(i,n))
    
    while len(answer)< t :
    	# 해당 인덱스 값만 가져오기 
        answer += num[p-1]
        p += m 
        
    return answer