처음에는 문제에서 입력 사항이 많아서 헷갈렸는데 어려운 문제는 아니었다.
1. 0에서부터 목표하는 숫자까지 n진법으로 변환해서 문자열 리스트에 저장해둔다
→ 목표하는 숫자의 최대 range는 게임 참가 인원(m), 미리 구해놓을 수(t) 만큼만 확보해놓으면 그 안에서 처리할 수 있다. 0~8까지 구한다고 했을 때, 2진수가 되면 0~1000 이렇게 늘어나니까 이보다 적게 필요하기도 함. 최대가 m*t.
2. 변환한 리스트에서 튜브 순서에 해당하는 인덱스 값의 원소들만 뽑아오면 정답
→ 튜브 순서는 주어졌고, 리스트니까 인덱스는 (튜브 순서 - 1). 이 후 사람 수(m)만큼 인덱스를 증가시키면 튜브 순서에 해당하는 인덱스 값이다. 미리 구해놓을 수의 갯수만큼 출력이 되면 종료하면 된다.
로직은 상당히 간단한데 파이썬에서 n진수 → 10진수 변환은 int를 사용하고 10진수 → 2,8,16진수로의 변환은 bin, oct, hex와 같은 내장함수가 있어서 10진수 → n진수로의 변환도 간단한 방법이 있을 줄 알았는데 파이썬에서도 이 방법은 직접 구현해야했다.
def convert(num, base):
temp = "0123456789ABCDEF"
q, r = divmod(num, base)
if q == 0:
return temp[r]
else:
# q를 base로 변환
# 즉, n진수의 다음 자리를 구함
return convert(q, base) + temp[r]
def solution(n, t, m, p):
answer = ''
test = ''
for i in range(m*t):
test += str(convert(i, n))
while len(answer) < t:
answer += test[p-1]
p += m
return answer
대부분 비슷하게 재귀함수를 이용해서 10진수를 n진수로 변환하는 함수를 만들어서 풀이했다. 진법 문제는 자주 나오니까 잘 활용할 수 있도록 익혀둬야겠다.
#재귀함수 이용 - 10진수를 n진수로
def convert(n, base):
arr = "0123456789ABCDEF"
q, r = divmod(n, base)
if q == 0:
return arr[r]
else:
return convert(q, base) + arr[r]
print(int('111',2)) #7
print(int('222',3)) #26
print(int('333',4)) #63
print(int('444',5)) #124
print(int('555',6)) #215
print(int('FFF',16)) #4095
print(bin(10)) #0b1010
print(oct(10)) #0o12
print(hex(10)) #0xa
def convert(num, base):
temp = "0123456789ABCDEF"
q, r = divmod(num, base)
if q == 0:
return temp[r]
else:
# q를 base로 변환
# 즉, n진수의 다음 자리를 구함
return convert(q, base) + temp[r]