코딩테스트/프로그래머스

[프로그래머스] [Level 2] [2018 KAKAO BLIND RECRUITMENT] n진수 게임

박소민 2022. 5. 10. 17:34
n진수 게임
 

코딩테스트 연습 - [3차] n진수 게임

N진수 게임 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0

programmers.co.kr

 

  • 내 풀이
    • deque 이용해서 popleft로 하나씩 출력
    • divmod(): 두 숫자를 나누어 몫과 나머지를 tuple로 반환하는 함수
from collections import deque
def solution(n, t, m, p):
    answer = ''
    queue=deque('0') #가장 첫번 째 값 0
    num=0
    count=1
    def jinsu(n,q):
        base=''
        while n>0:
            n,mod=divmod(n,q)
            base+=str(mod)
        return base[::-1]
    
    while t>0:
        if not queue:
            num+=1
            if n==16:
                queue+=format(num,'X')
            else:
                queue+=jinsu(num,n)
        else:
            if count==p:
                if count==m:
                    count=1
                else:
                    count+=1
                answer+=queue.popleft()
                t-=1
            else:
                if count==m:
                    count=1
                else: 
                    count+=1
                queue.popleft()

    return answer

 

→ 실행 케이스 20,21,23,26 실패

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 내 풀이 (수정)
    • 10진수 → N진수 변환 함수 변경
      • 위의 변환 함수는 10진수 이하만 가능
      • 10~15를 A~F로 나타내는 전체진수 계산 가능한 함수
#N진수 변환 함수
#10~15를 A~F로 나타낸다
def jinsu(n, base):
        arr = "0123456789ABCDEF"
        q, r = divmod(n, base)
        if q == 0:
            return arr[r]
        else:
            return jinsu(q, base) + arr[r] #맨뒤 나머지부터 출력됨
from collections import deque
def solution(n, t, m, p):
    answer = ''
    queue=deque('0') #가장 첫번 째 값 0
    num=0
    count=1
    def jinsu(n, base):
        arr = "0123456789ABCDEF"
        q, r = divmod(n, base)
        if q == 0:
            return arr[r]
        else:
            return jinsu(q, base) + arr[r]
    
    while t>0:
        if not queue:
            num+=1
            queue+=jinsu(num,n)
        else:
            if count==p:
                if count==m:
                    count=1
                else:
                    count+=1
                answer+=queue.popleft()
                t-=1
            else:
                if count==m:
                    count=1
                else: 
                    count+=1
                queue.popleft()

    return answer
print(solution(2,4,2,1))
print(solution(16,16,2,1))
print(solution(16,16,2,2))
#결과
"0111"
"02468ACE11111111"
"13579BDF01234567"

 

 

  • 다른 사람 풀이
def convert(m,n):
    total = "0123456789ABCDEF"
    i,j = divmod(m,n)
    if i ==0:
        return total[j]
    else : 
        return convert(i,n)+total[j]

def solution(n, t, m, p):
    total = ''
    answer=''
    for i in range(t*m):
        total+=convert(i,n)
    for i in range(t):
        idx = p-1 + i*m
        answer +=total[idx]
    return answer