본문 바로가기

알고리즘풀이/프로그래머스

[2/18] Kakao Internship 기출문제 풀이

👉 사용 언어 : PYTHON3

[3차] n진수 게임

✅ Solution

def solution(n, t, m, p):
    base = ''
    ans = ''
    num = 0
    while len(base) < (m*(t-1)+p):
        base += ''.join(list(map(str, n_base(num, n))))
        num += 1
    for i in range(len(base)):
        if i == (p-1) or (i - (p-1)) % m == 0 and len(ans) < t:
            ans += base[i]
    return ans

def n_base(num, n):
    res = []
    int_alpha = {10:'A', 11:'B', 12:'C', 13:'D', 14:'E', 15:'F'}
    while num > 0:
        remain = num % n
        res.append(remain if remain < 10 else int_alpha[remain])
        num = num // n
    res.reverse()
    return res if len(res) != 0 else [0]

 

👉 문제 설명 및 제한 사항

  • 게임 규칙
    • 숫자를 0부터 시작해서 차례대로 말한다. (0, 1, 2, ..., 9)
    • 10이상 숫자 : 한 자리씩 끊어서 말한다. (10 > 1, 0)
    • 이진수로 적용하면❓ 0, 1, 1, 0,1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, ...
    • 난이도를 높이기 위해 2진법 ~ 16진법 중 하나로 게임 진행
  • 매개변수 : 진법 n, 미리 구할 숫자 개수 t, 게임 참가 인원 m, 튜브 순서 p
    • 2 <= n <= 16
    • 0 < t <= 1000
    • 2 <= m <= 100
    • 1 <= p <= m
  • 리턴값 : 튜브가 말해야 하는 숫자 t개를 공백 없이 차례대로 나타낸 문자열
    • 10 ~ 15 : 대문자 A ~ F 로 표현

👉 아이디어

< n진법으로 표현하는 방법 >

  • n 진수로 변환한 값을 문자 리스트로 반환하는 함수 정의 _ n_base
    • n으로 나눈 나머지를 차례대로 추가하여 마지막에 리스트를 뒤집어서(.reverse()) 반환한다.
    • 나머지가 두 자릿수인 경우(10~15)에는 대문자로 치환하여 저장한다.
    • 전달받은 숫자가 0인 경우(= 나머지를 저장한 배열의 길이가 0인 경우) [0]을 반환하도록 조건문을 추가한다.  
  • 튜브가 t개를 말할 수 있을 때까지 반복문을 돌려 0부터 n진법으로 표현한 값을 문자열 base에 추가한다.
    • 튜브가 t개 말하려면❓ 최소 (m*(t-1)+p)개의 숫자가 필요하다.
  • 그 중 튜브가 말해야 하는 숫자는 p번째 or m의 배수 번째 숫자이다.
    • 인덱스는 0부터 시작하므로 조건문에서 p대신 p-1로 계산한다.
    • 정답 문자열에 추가한 숫자 개수가 t개가 되면 반복문을 종료하도록 조건을 추가한다.
      • 애초에 base 문자열에 (m*(t-1)+p)개 이상의 숫자가 들어있을 수 있기 때문에❗
  • 정답 문자열 ans를 반환한다.

 

 다른 사람 풀이 참고

def solution(n, t, m, p):
    data = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]
    numbers = "0"
    for number in range(1, t*m):
        temp = []
        while number > 0:
            temp.append(data[number%n])
            number //= n
        numbers += "".join(reversed(temp))

    return numbers[p-1:t*m:m]

 

👉 깨달은 것 / 알게된 것

  • 배열을 역순 정렬할 때, 문자열.reverse() 대신 문자열[::-1] 을 사용할 수 있다.
    • [::-1] : 전체 문자열을, 뒤로 1개씩 가면서 찍기
  • 딕셔너리를 사용하지 않고 아예 0~F까지 리스트 에 넣어 풀이할 수 있다.
  • 애초에 문자열에 0을 넣고 시작한다.
  • [p-1 : t*m : m] : 인덱스가 p-1인 문자부터 찍고, m개씩 이동해서 찍기, (t*m)-1 인덱스까지 도달