レベル3に並ぶ方法



  • 解き方

  • <初期解答方式>
    from itertools import permutations
    def solution(n, k):
        firstLine = list(range(1, n + 1))
        lines = list(permutations(firstLine, len(firstLine)))[k - 1:k]
    
        return lines.pop()
  • 精度:12、13時間超
  • 効率:0点
  • 原因:nの範囲は20以下の自然数なので、置き換えのようなn!ある繰返し回数のメソッドを使用するとタイムアウトが発生します.
  • ソリューション:階乗

  • <因数分解>
    「シーケンスの純粋な原理は乗算と同じです」

  • n並ぶ方法はn!

  • 1番目の位置が確定した後の残りの並び方の数はn-1!木の枝
    [1,2,3]なら

  • 最初の場所を指定した場合:nP 1*(n-1)!

  • 1番が1位なら2(n-1!)木の枝

  • 2番が1位でも2(n-1!)木の枝

  • 3番が1位でも2(n-1!)木の枝

  • 2位になるとnP 2*(n-2)!

  • なぜk-1//因式分解に分けたのか
    ≪行|Row|Essbase_Studio≫で索引を検索してポップアップする場合に使用します

  • k−1は直感的にk番目であるが,インデックス的にはk−1番目である.

  • 具体的な説明

  • line = [1,2,3]
    K-1:前列
    0番目~:1
    2番目の~:2
    4つ目~:3
    (k-1)//(n-1)! = 行の索引(検索する人の番号)

  • line2 = [1,2,3,4]
    i+(n-1)!=前席
    1つ目~:1
    7番目~:2
    13番目~:3
    19番目~:4
    (k-1)//(n-1)! = 「行の索引」
    (k-1)=0、1、2、3、4、5の「行インデックス」は1
    (k-1)=6,7,8,9,10,11の「lineのインデックス」は2
    (k-1)=12,13,14,15,16,17の「lineのインデックス」は3
    (k-1)=18,19,20,21,22,23の「lineのインデックス」は4

  • k%=原因
    :kを順番に減らすプロセス
    すなわち,実装には書き込み置換のみが必要であるが,タイムアウト順序の純粋な原理出力に必要な部分としてプレースホルダ(factorial)を用いなければならない.