[テストエンコーディング例]スキルツリー


問題の説明
先行スキルとは、あるスキルを学ぶ前に学ばなければならないスキルです.
例えば、現在スキル順が「スパーク」→「発光ボルト」→「カッター」の場合、学習カッターはまず「発光ボルト」を学び、「発光ボルト」はまず「スパーク」を学ぶ.
以上の手順にない他のスキル(癒しなど)は順番に学ぶことができます.そのため、スパーク→癒し→ハイライトボルト→メスなどのスキルツリーを使用することは可能ですが、メス→スパークまたはハイライトボルト→スパーク→癒し→メスなどのスキルツリーを使用することは不可能です.
先行スキル順スキルとプレイヤーが作成したスキルツリー1の配列スキルtreeをパラメータとして付与する場合は、できるだけスキルツリーの個数を返すsolution関数を書き出します.
せいげんじょうけん
スキルはアルファベット大文字でマークされ、すべての文字列はアルファベット大文字のみで構成されています.
スキル順序とスキルツリーは文字列で表されます.
例えば、C→B→DであればCBDと表記する.
前置スキル順序スキルの長さは1以上26以下で、スキルは繰り返してはいけません.
skill treesは、長さが1または20未満の配列である.
skill treesの要素はスキルを表す文字列です.
skill treesの要素の長さは2または26未満であり、このスキルは繰り返しません.
I/O例
skill : CBD
skill_trees : [BACDE, CBADF, AECB, BDA]
return : 2
I/O例説明
BACDE:Bスキルの前にCスキルを学ぶ.不可能なスキル
CBADF:可能なスキルツリー.
Apache:可能なスキルツリー.
BDA:Bスキルを学ぶ前に、Cスキルを学ばなければなりません.不可能なスキルツリー
私が解読したコード
まず、skill treeリストの各要素が実行可能かどうかを決定するために、関数check()が実装される.
可能であれば、Trueに戻ってそれを計算すれば、答えは正しい!
def check(skill, string): ## skill과 skill_trees의 원소를 인자로 받음
    check = [0]*len(skill) ## 스킬 순서대로 나왔으면 해당 스킬에 1을 표시하는 리스트
    
    for i in string:
        if i in skill:
            index = skill.index(i) ## 스킬의 인덱스 추출
            ## index가 0일 경우만 임으로 1을 지정해줌
            if index == 0:
                check[index] = 1            
            ## 그전에 선행 스킬이 모두 나오지 않았다면 False 반환
            elif index != sum(check[:index]):
                return False
            ## 선행 스킬이 나와있으면 i의 인덱스에 해당하는 check를 1로
            else:
                check[index] = 1
    
    return True
 

def solution(skill, skill_trees):
    answer = 0
    
    for i in skill_trees:
        if check(skill, i) == True:
            answer += 1
    
    return answer