국문과 유목민

(Week1)[N진법] n진수 게임 본문

알고리즘_코딩테스트/주간코딩 스터디 (주코스)

(Week1)[N진법] n진수 게임

논곰 2022. 6. 20. 15:10

 

주간 코딩스터디 때 푼 문제들을 정리하고 있습니다. 구체적인 문제에 대한 정보는 게시글 내 링크를 살펴봐주세요

소요시간: 40분 

1. 문제 설명

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

 

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

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

programmers.co.kr

  1. 숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.
  2. 10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다.
  3. 이렇게 16진법까지도 게임을 진행할 수 있게 프로그램을 만든다.

2. 접근 방식

  • 미리 구할 숫자의 개수가 t개라면 총 m*t만큼의 수를 뽑아야 한다.
  • 진법에 따라서 뽑아야 하는 숫자는 달라짐
  • 뽑아야 하는 숫자는 n으로 나눈 값의 나머지로 결정. 단, 다음 수도 생각해야 하니 이중 for문 
  • 나머지 값이 10~15이면 A, B, C, D, E, F로 

3. 코드

def solution(n, t, m, p):
    ## 진수 구분
    num_ls = {}
    alpha = "A, B, C, D, E, F".split(", ")
    for i in range(16):
        num_ls[i] = str(i)
    for i,v in enumerate(range(10, 16)):
        num_ls[v] = alpha[i]
        
    # m*t까지만 숫자를 계산해도 됨
    number = m*t
    numbers = ""
    for i in range(number):
        tmp = []
        while i >= n:
            rem = i % n
            i = i // n
            tmp.append(num_ls[rem])
        tmp.append(num_ls[i % n])
        numbers += "".join(tmp[::-1])
        
    # 조기 중지
        if len(numbers) >= number:
            break
    
    # 코드 출력 완성
    result = ""
    for i in range(1, t+1):
        ls = numbers[m*(i-1):m*i]
        result += ls[p-1]
    return result

4. 코멘트

  • N진법 문제는 나머지와 몫의 관계만 잘 파악하면 쉽게 풀 수 있는 문제라고 생각한다. 첫 주에 오랜만에 푼 문제이다보니까 조금 헤매기는 했지만 그래도 수월하게 풀 수 있었던 것 같다.