スキルツリー


プログラマ-スキルツリー

問題の説明


先行スキルとは、あるスキルを学ぶ前に学ばなければならないスキルです.
たとえば、現在のスキルの順序が스파크 → 라이트닝 볼트 → 썬더の場合、ライターを学習する前にライターを学習する必要があります.
以上の手順にない他のスキル(癒しなど)は順番に学ぶことができます.このため、스파크 → 힐링 → 라이트닝 볼트 → 썬더等の技能木を使用することができるが、썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더等の技能木を使用することはできない.
前置スキル順序スキルとプレイヤーが作成したスキルツリーの配列スキルtreeをパラメータとして指定する場合は、できるだけスキルツリーの数を返すsolution関数を作成します.

せいげんじょうけん

  • スキルはアルファベット大文字でマークされ、すべての文字列はアルファベット大文字のみで構成されています.
  • スキル順序とスキルツリーは文字列で表されます.
    例えば、
  • C → B → Dであれば「CBD」と表記される.
  • 前置技能順序技能の長さは1以上26以下であり、技能は繰り返してはならない.
  • skill treesは、長さが1または20未満の配列である.
  • skill treesの要素は、スキルを表す文字列です.
  • skill treesの要素は、2または26より長い文字列であり、このスキルは繰り返しません.
  • I/O例


    skillskill_treesreturn "CBD" ["BACDE", "CBADF", "AECB", "BDA"] 2

    ソリューション


  • スキルツリーから文字を1つずつ取得します.
    いずれにしてもskill文字列で先決スキル条件が守られているかを確認するためには,まず各スキルツリーから順次文字を導入して比較することが考えられる.

  • 比較する文字はスキルに含める必要があります.
    スキルツリーから見ると,前置スキルに関係のないスキルは随時学習できるので,文字を比較する際にはスキル中の文字認知検査を行い,比較を行う.
  • 他人の解答


    しかし、この問題を解決することができなかったので、他の人の解答で答えを確認しました.
    def solution(skill, skill_trees):
        answer = 0
    
        for skills in skill_trees:
            skill_list = list(skill)
    
            for s in skills:
                if s in skill:
                    if s != skill_list.pop(0):
                        break
            else:
                answer += 1
    
        return answer
    リストメソッドの1つであるpopを使用するためにskillをリストに変換して使用します.skillで一度チェックしたスキルは、後で現れないと条件を満たすので、再チェックは必要ありません.だからpopで条件をチェックしながらリストから削除します.for ... elseドアを使用して、より簡潔に表現されています.for ... else繰り返し文がbreakによって中断されない場合、else文が実行される.上記のコードでは、重複文が中断されていないことは、このスキルツリーが前のスキル順序をよく満たしていることを意味し、1つの答え値が増加します.