2레벨 문제!!
숫자 0부터 시작해서 사람들이 차례대로 말하는데 10부터는 1을 말하고 다음 사람은 0을 말하고 11이면 1을 말하고 다음사람은 1을 말하는 식으로 10이상부터는 한자리씩 끊어서 말한다.
이 숫자들을 주어진 n진법으로 바꿔서 말한다.
n : 진법
t : 미리 구할 숫자의 갯수
m : 게임에 참가하는 임원
p : 튜브의 순서
주어진 순서대로 튜브가 말할 숫자를 String으로 합쳐서 한개의 String을 출력하면 된다.
사실상 문제에서 물어보는것은 n진법으로 바꾸는법을 물어보는 문제인것 같다.
그럼 진수 변환 함수를 만들어 보자 !
string 모듈을 이용해서
0~9까지 A부터 Z까지의 (16진수라 Z까지는 필요없지만) string을 만들어 준다.
그러고 그 숫자를 n진수이면 n으로 나눠주며 진수 변환을 진행한다.
재귀함수로 몫이 0일때 까지 계속 진행한다.
import string
tmp = string.digits + string.ascii_lowercase
def convert(num, base):
q, r = divmod(num, base)
if q == 0:
return tmp[r]
else:
return convert(q, base) + tmp[r]
이렇게 10진수의 수를 n진수로 바꿔주는 함수가 완성되었다.
n진수 게임이 진행될 수를 구한다! 튜브가 마지막으로 말하는 숫자 까지만 진행되면 되기때문에
(t-1)*m +p 가 마지막 튜브가 구할숫자의 순서이다.
for문을 이 마지막 번호까지 돌리면서 temp list에 n진수로 변환시킨 10진수를 list로 나눠서 하나씩 추가해준다.
그리고 answer 에 튜브의 차례일때 마다 해당하는 temp list의 숫자를 더해준다!!
그러면 정답!
import string
tmp = string.digits + string.ascii_lowercase
def solution(n, t, m, p):
## n: 진법 t: 미리 구할 숫자의 갯수 , m 게임에 참가하는 인원, p 튜브의 순서
answer = ''
temp = []
last_num = (t - 1) * m + p
for i in range(last_num):
if len(temp) <= last_num:
for j in range(len(list(convert(i, n)))):
temp.append(list(convert(i, n))[j])
for i in range(p - 1, last_num, m):
answer += temp[i]
# print(temp)
# print(answer)
return answer.upper()
def convert(num, base):
q, r = divmod(num, base)
if q == 0:
return tmp[r]
else:
return convert(q, base) + tmp[r]
solution(2, 4, 2, 1)
# solution(16, 16, 2, 1)
문제 해결!!! n진수로 바꾸는 법을 잘 알아두자 !
String 모듈을 활용해서 0~9까지 a~z까지 문자열을 만들수 있다는 것도