본문 바로가기

알고리즘 문제

Programmers Level 5 줄 서는 방법

import math as m
def setAlign(n,k):
answer = [] #답 리스트
num = [i for i in range(1, n + 1)] #[1...n] 리스트 생성
while num: #리스트가 빌 때까지
n-=1 #자리수 하나씩 감소
fac = m.factorial(n)
answer.append(num.pop((k-1)//fac)) #답 리스트에 [1...n] 리스트에 있는 숫자를 팝해서 붙임. (k-1)//(n!//n). k번째 수의 맨 앞 자리 수는 (k-1)//(n-1)! + 1. (k-1)//(n-1)!을 인덱스 삼아 num에서 값을 찾으면 +1 한 결과가 남. 왜냐하면 num[i]=i+1 이므로.
k%=fac #다음에 구할 순서는 기존의 순서 k번째를 1만큼 감소한 n의 팩토리얼로 나눈 나머지가 된다. k = k % factorial(n-1). while문 한번 돌 때마다 n은 1씩 감소하고 k도 n의 영향을 받으며 바뀐다.
return answer
print(setAlign(4,5))