プログラマーSweekleyが疲労度に挑戦


質問する
88/100
30分
意図["최소 필요 피로도", "소모 피로도"] 大きなスタートから並べ替えた後
k最小必要疲労度が大きい
消費疲労度でkを減算する場合,値が0より大きいと探検が可能となるため,コードを記述した.
function solution(k, dungeons) {
    var answer = 0;
    dungeons.sort((a,b)=>{
        let bb = b[0]-b[1], aa=a[0]-a[1]
        
        if(bb !== aa)
        return bb - aa
        if(b[0]!==a[0])
            return b[0]-a[0]})

    dungeons.forEach(arr=>{
        if(arr[0] <= k && k-arr[1] >=0 ){
            k=k-arr[1]
            answer++;
        }

    })
    return answer;
}
いくつかの面で失敗した.△例外はまだ分かりません.
他人の解答
dfsのような探索を利用したようです.
function solution(k, d) {
   const N = d.length
    const visited = new Array(N).fill(0)
    let ans = 0

    function dfs(k, cnt){
        ans = Math.max(cnt, ans)

        for (let j = 0; j < N; j++){
            if (k >= d[j][0] && !visited[j]){
                visited[j] = 1
                dfs(k - d[j][1], cnt + 1)
                visited[j] = 0
            }
        }
    }

    dfs(k, 0)

    return ans;
}
dfsという名前の関数を作成し、内部で作成します.
for文で各配列の値から開始します.
(アレイ長)
  • の条件下では、kの最小需要疲労度はより大きく、未アクセスの場所であればアクセスが適用される.
    新しいdfsを用いて減少したk値.
    このときcntは成功したので,新しいdfsパラメータとして
  • を追加した.
  • は、ブンハンサイクルが終了した後、再開しなければならない.
    アクセスはすべてゼロにし直し、最初から開始します.
  • 30, [[10, 10], [10, 10], [10, 10]]のパラメータが受信された場合
    3のお金を受け取ります.
    function solution(k, d) {
       const N = d.length
        const visited = new Array(N).fill(0)
        let ans = 0
    
        function dfs(k, cnt){
            ans = Math.max(cnt, ans)
    
            for (let j = 0; j < N; j++){
                if (k >= d[j][0] && !visited[j]){
                    
                    visited[j] = 1
    console.log(visited)
                    dfs(k - d[j][1], cnt + 1)
                    visited[j] = 0
                }
            }
        }
    
        dfs(k, 0)
    
        return ans;
    }
    このようなコンソールログ#ログ#
    [ 1, 0, 0 ]
    [ 1, 1, 0 ]
    [ 1, 1, 1 ]
    [ 1, 0, 1 ]
    [ 1, 1, 1 ]
    
    [ 0, 1, 0 ]
    [ 1, 1, 0 ]
    [ 1, 1, 1 ]
    [ 0, 1, 1 ]
    [ 1, 1, 1 ]
    
    [ 0, 0, 1 ]
    [ 1, 0, 1 ]
    [ 1, 1, 1 ]
    [ 0, 1, 1 ]
    [ 1, 1, 1 ]
    このように区別すると、このように区別されます.
    1アクセスベース.
    最初のシナリオと
    2番目のシナリオと
    先にアクセスする3番目の配列に分けられます.
    その他のチームメンバーの回答
    const getPermutations= function (target, num) {
        const results = [];
    
        if (num === 1) {
            return target.map((value) => [value]);
        }
    
        target.forEach((fixed, index, origin) => {
          const rest = [...origin.slice(0, index), ...origin.slice(index + 1)];
          const permutations = getPermutations(rest, num - 1);
          const attached = permutations.map((permutation) => [fixed, ...permutation]);
          results.push(...attached);
        });
    
        return results;
    };
    
    function solution(k, dungeons) {
        let maxVisitedDungeons = 0;
        const permutations = getPermutations(dungeons, dungeons.length);
    
        for (const permutation of permutations) {
            let currentTired = k;
            let visitedDungeons = 0;
    
            for (const [neededTired, useTired] of permutation) {
                // neededTired는 useTired보다는 무조건 크니까 
                // currentTired와 useTired를 비교할 필요는 없지
                // currentTired > neededTired > useTired
                if (currentTired < neededTired) {
                    continue;
                }
    
                currentTired -= useTired
                visitedDungeons += 1
    
            }
            maxVisitedDungeons = Math.max(visitedDungeons, maxVisitedDungeons)
        }
    
        return maxVisitedDungeons;
    }
    可読性は確かによい.
    可能なすべてのシーケンスを見つけます.
    この扉を通って