[Algorithm/JavaScript]スキルツリー


Programmers Level.2 Question Review 💡
質問元:https://programmers.co.kr/learn/courses/30/lessons/49993

質問する


問題の説明


先行スキルとは、あるスキルを学ぶ前に学ばなければならないスキルです.
例えば、現在技順が스파크 → 라이트닝 볼트 → 썬더の場合、日焼け止めを習うには、まず発光ボルト、発光ボルト、まず火花を習う.
以上の手順にない他のスキル(癒しなど)は順番に学ぶことができます.したがって、스파크 → 힐링 → 라이트닝 볼트 → 썬더と同じスキルツリーを使用することは可能ですが、썬더 → 스파크라이트닝 볼트 → 스파크 → 힐링 → 썬더同じスキルツリーを使用することはできません.
先行スキル順スキルとプレイヤーが作成したスキルツリー1の配列スキルtreeをパラメータとして付与する場合は、できるだけスキルツリーの個数を返すsolution関数を書き出します.

せいげんじょうけん

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



    I/O例説明

  • 「BACDE」:Bスキルを習得する前に、Cスキルを習得しなければならない.不可能なスキル
  • 「CBADF」:可能なスキルツリー.
  • 「愛」:可能なスキルツリー.
  • 「BDA」:Bスキルを習得する前に、Cスキルを習得しなければならない.不可能なスキルツリー
  • 回答の提出

    function solution(skill, skill_trees) {
        var answer = 0;
        let skillArr = skill.split(""); //skill 요소를 배열로 나누어두기. 인덱스로 순서를 비교할 예정.
        let newStr;
        
        skill_trees.forEach(str => {
         newStr = str.split("").filter(el => skillArr.includes(el)).join("");//skillArr에 있는 요소들만 '차례대로' 반환해서 string으로 만들기  
         if (newStr === skill.substring(0, newStr.length)) {
             answer++;
         }  
        })
        return answer;
    }

    今日のレソン


    、뉭뉭7、先頭、뉪뉪4とのstringの各要素のインデックスで大きさを比較すると、小さいのは大きい順かどうか確定できるはずですが….漠然とした考えをした.
    しかし、最終的に確認したいのは、skillの文字がどの文字を挟んでいるかにかかわらず、skillの文字が順番にskills_treesの中にあるかどうかです.
  • だからskill_treesの各要素をめぐってskillArr(skill을 배열로 쪼개준 것)の要素が一致する文字がある場合に、順に新しい文字列を作成していきます(newStr)、この2つの新しい文字列がskillのすべての要素が同一であると仮定した仮定の下で、この2つの文字列を比較しました.
  • 以下のように配列の組み込み方法を連続的に使用するのはほぼ初めて.配列の仕方を熟知すれば、コードの長さを短くすることができ、かなり便利だと感じます.特に、filter()という方法で最初に要素を一つ一つ比較したいと思っていた計画を覆すことができて、とても嬉しかったです.
  • newStr = str.split("").filter(el => skillArr.includes(el)).join("");
    覚えておいてください.
  • filter()コールバック関数の条件を満たす要素だけをフィルタして並べ替えます.また、順序も如実に反映されます.