문제 보기 · 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단계 · 코드 흐름
- 수 x를 n진수 문자열로 바꾸는 함수를 만든다.
- 0부터 차례로 바꿔 붙이며 전체 줄이 t × m글자 이상이 될 때까지 늘린다.
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-
프로그래머스 스쿨, “[3차] n진수 게임” (https://school.programmers.co.kr/learn/courses/30/lessons/17687), 2026-09-30 조회. ↩