파이썬 알고리즘 : n진수 게임

2018 카카오 코딩테스트

2024년 4월 1일 알고리즘 문제풀이

문제

난이도

Lv.2

코드

1차

실패

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def find_limit(a,b):
    # a를 b진법으로 바꿀 때 자릿수를 반환
    idx = 0
    while b**idx < a:
        idx += 1
    return idx

def change(k,m):
    # k를 m진법으로 변환하는 함수
    max_val = find_limit(k,m)
    arr = [0 for _ in range(max_val)]
    for i in range(max_val):
        arr[i] = k//(m**(max_val-(i+1)))
        k -= arr[i]*(m**(max_val-(i+1)))
    return str(''.join(arr))

def solution(n, t, m, p):
    answer = ''
    arr = []
    numbers = [str(i) for i in range(10)] + ['A', 'B', 'C', 'D', 'E', 'F']
    n_numbers = numbers[:n]
    for i in range(m*t):
        num = change(i,n)
        print(num)
    return answer

m명이 t개를 불러야 하므로 m*t까지 숫자를 구한다음, 모두 n진법으로 바꾸려 했다. 문자열로 조각내 배열에 담은다음 찾으면 될 듯 했다. 진법 변환을 못하겠다..

2차

실패

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def change(n, base):
    numbers = [str(i) for i in range(10)] + ['A', 'B', 'C', 'D', 'E', 'F']
    q, r = divmod(n, base)

    if q == 0:
        return numbers[r]
    else:
        return change(q, base) + numbers[r]

def solution(n, t, m, p):
    answer = ''
    arr = []
    for i in range(m*t):
        arr += list(change(i,n))
    
    for j in range(t):
        answer += arr[t]
    return answer

튜브가 불러야 한 순서의 글자들을 찾지 못하고 있었다. 아무래도 index는 0부터 시작하지만 순서는 1부터 시작하기 때문인듯 하다.

3차

100/100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def change(n, base):
    numbers = [str(i) for i in range(10)] + ['A', 'B', 'C', 'D', 'E', 'F']
    q, r = divmod(n, base)

    if q == 0:
        return numbers[r]
    else:
        return change(q, base) + numbers[r]

def solution(n, t, m, p):
    answer = ''
    arr = ['x']
    for i in range(m*t):
        arr += list(change(i,n))
    
    for j in range(t):
        answer += arr[p+j*m]
    return answer

index와 순서를 통일하기 위해 의미없는 문자로 0번 인덱스를 채워줬다.