[Programmers][Lv.3]キューの方法


[問題リンク]-https://programmers.co.kr/learn/courses/30/lessons/12936
問題の説明

せいげんじょうけん

に答える
import math

def solution(n, k):
    answer = []
    k -= 1  
    order = [i for i in range(1, n+1)]  # 순서 생성
    for i in range(n):
        num = math.factorial(len(order)) 
        temp = num // len(order)       # 현재 차례가 몇가지 경우의 수인지 
        idx = (k // temp)              # 현재 차례가 몇 번째 수가 와야하는지 
        k %= temp                      # 다음 차례가 됨에 따라 차례 재 설정
        answer.append(order.pop(idx))  # 현재 차례 숫자 answer에 
    return answer
最初はPermutationを使いましたが、効率の問題でタイムアウトに失敗しました.
そのため、私はもう一つの解決策を考えなければなりません.すぐに工場を通じてルールを見つけることができます.
  • の総数はいくつかのグループに分けることができ、
  • の束の順序によって、順序をビット単位で計算します.
  • そして次の位置を求めるために順序を再設定した.
  • 最初にkに-1を加えたのは、例を加えても
    結果はいつも次の値が出てきて、試して合格しました.
    通過後、他の人の草を見ると、元はkがちょうど分かれていたので、0になっていた場合…
    したがって、answer.append部を以下のコードに変更すると、より論理的になる.
    if k == 0:
        answer.append(order.pop(idx-1))
    else:
        answer.append(order.pop(idx))
    結果