문제 보기 · Level 2 · 2018 KAKAO BLIND RECRUITMENT (3차) · 정답률 63% · 푼 사람 17,129명 (2026-09-30 기준)1

문제

m명이 둥글게 앉아 0부터 차례로 수를 n진법으로 말한다. 두 자리 이상인 수는 한 자리씩 끊어 말한다. 튜브는 p번째 순서다. 튜브가 말할 숫자 t개를 이어 붙인 문자열을 돌려준다. 10~15는 A~F로 쓴다.

  • 2 ≤ n ≤ 16
  • 0 < t ≤ 1,000
  • 2 ≤ m ≤ 100, 1 ≤ p ≤ m

풀이

막히면 한 단계씩 펼친다.

필요한 개념
1단계 · 작은 예로 손으로 풀기

10진법(n = 10), 3명(m = 3), 튜브는 2번째(p = 2), 3개(t = 3)

  • 모두가 말하는 숫자를 한 줄로 쓰면: 0 1 2 3 4 5 6 7 8 9 1 0 1 1 …
  • 한 사람씩 돌아가며 말하니, 튜브는 2번째, 5번째, 8번째, … 글자를 말한다(3칸마다).
  • 2번째 = 1, 5번째 = 4, 8번째 = 7 → “147”

게임 전체를 사람별로 따라갈 필요가 없다. 모두가 말하는 숫자를 한 줄로 만들어 두고, 튜브 자리만 골라내면 된다.

2단계 · 가장 단순한 방법과 그 속도

튜브가 t번 말하려면 전체 줄이 적어도 t × m글자여야 한다. 최대 1,000 × 100 = 10만 글자다. 0부터 수를 하나씩 n진수로 바꿔 이어 붙이며 10만 글자를 채우면 된다. 넉넉하다.

3단계 · 핵심 아이디어
  • n진수로 바꾸기: 수를 n으로 나눈 나머지가 끝자리다. 몫으로 바꿔 되풀이한다. 나머지 10~15는 "0123456789ABCDEF"[나머지]로 글자를 고른다. 0은 따로 “0”이다(반복문이 한 번도 안 돌기 때문).
  • 튜브 자리 고르기: 전체 줄의 번호는 0부터니 튜브의 첫 글자는 p - 1번이다. 그 뒤로 m칸마다다. 파이썬으로 seq[p - 1::m]이다. 앞에서 t개만 자른다.
4단계 · 코드 흐름
  1. 수 x를 n진수 문자열로 바꾸는 함수를 만든다.
  2. 0부터 차례로 바꿔 붙이며 전체 줄이 t × m글자 이상이 될 때까지 늘린다.
  3. seq[p - 1::m][:t]를 돌려준다.
5단계 · 파이썬 코드
def solution(n, t, m, p):
    digits = "0123456789ABCDEF"

    def to_base(x):
        if x == 0:
            return "0"
        s = ""
        while x > 0:
            x, r = divmod(x, n)
            s = digits[r] + s           # 나머지가 끝자리. 앞에 붙인다
        return s

    parts, length, num = [], 0, 0
    while length < t * m:
        part = to_base(num)
        parts.append(part)
        length += len(part)
        num += 1
    seq = "".join(parts)                # 모두가 말하는 숫자를 한 줄로
    return seq[p - 1::m][:t]
  • digits[r]: 나머지 r에 맞는 글자다. 11이면 “B”다.
  • 조각을 리스트에 모았다가 "".join으로 한 번에 붙인다. 문자열을 반복해서 +=로 붙이는 것보다 안전한 습관이다.
  • seq[p - 1::m]: p − 1번부터 끝까지 m칸마다 고른다.
6단계 · 실행 추적

n = 2, t = 4, m = 2, p = 1

수 0 1 2 3 4
2진수 0 1 10 11 100

전체 줄: “0110111…”에서 8글자면 충분하다(4 × 2). “01101110” 중 0, 2, 4, 6번 글자 → “0111”

7단계 · 복잡도와 흔한 실수

전체 줄을 t × m글자까지 만드니 \(O(tm)\)이다.

  • 0을 n진수로 바꿀 때 빈 문자열이 나온다. 0은 따로 처리한다.
  • p를 0부터 센 번호로 착각한다. 첫 글자는 p - 1번이다.
  • 10~15를 소문자나 숫자 두 자리(“10”)로 쓴다. 대문자 한 글자 A~F다.
검증: 문제의 예시 3개를 통과했고, 무작위 입력 2,000개에서 “사람을 한 명씩 돌리며 말하는 숫자를 하나씩 넘기는” 게임 그대로의 풀이와 결과가 같았다. 2·8·16진수 변환은 파이썬 format과도 비교했다 — 03_pg17687_p1.py
  1. 프로그래머스 스쿨, “[3차] n진수 게임” (https://school.programmers.co.kr/learn/courses/30/lessons/17687), 2026-09-30 조회. ↩