[プログラマー]疲労度
問題の説明
XXゲームには疲労度システム(0以上の整数で表示)があり、一定の疲労度探索コピーを使用できます.このとき,各レプリカには,探検開始に必要な「最小必要疲労度」と,レプリカ探検完了時に消費される「消費疲労度」がある.「最小必要疲労度」は、探検コピーに必要な最小疲労度を表し、「疲労度の消費」は、探検コピー後に消費される疲労度を表します.例えば、「最小需要疲労度」が80、「消耗疲労度」が20のコピーを探索するためには、プレイヤーの現在の残りの疲労度は80以上でなければならず、探検コピー後は20の疲労度を消費する.
このゲームには1日に1回探検できるコピーが複数あり、1人のプレイヤーが今日のコピーをできるだけ多く探検したいと思っています.プレイヤーの現在の疲労度kと各レプリカの「最小必要疲労度」、「消耗疲労度」の2次元配列がパラメータとしてしっかり与えられている場合は、解題関数を完了し、プレイヤーが探検できる最大レプリカ数を返してください.
せいげんじょうけん
I/O例
I/O例説明
今の疲労度は80です.
1つ目→2つ目→3つ目のコピーの順に探検すると
Solution
function adventure(k, dungeons) {
let count = 0
for (let i = 0; i < dungeons.length; i++) {
let [need, con] = dungeons[i]
if (k >= need) {
k -= con
count++
}
}
return count
}
function solution(k, dungeons) {
var answer = 0;
const getPermutations= function (arr, len) {
const results = [];
if (len === 1) return arr.map((el) => [el]);
arr.forEach((fixed, index, origin) => {
const rest = [...origin.slice(0, index), ...origin.slice(index+1)]
const permutations = getPermutations(rest, len - 1);
const attached = permutations.map((el) => [fixed, ...el]);
results.push(...attached);
});
return results;
}
let candi = getPermutations(dungeons, dungeons.length)
for (let i = 0; i < candi.length; i++) {
let count = adventure(k, candi[i])
if (count === dungeons.length) return count
if (count > answer) {
answer = count
}
}
return answer;
}
いずれも通過したが,時間的複雑さと空間的複雑さを考慮していないため,並べ替えは不適切な解決策である.
Refactoring
function solution(k, dungeons) {
var answer = 0;
let filtered = dungeons.filter(el => el[0] <= k)
let visited = new Array(filtered.length).fill(false)
const dfs = (energy, cnt) => {
for (let i = 0; i < filtered.length; i++) {
if (visited[i]) continue
let [need, con] = filtered[i]
if (energy < need) continue
visited[i] = true
let nextEnergy = energy - con
let nextCnt = cnt + 1
if (nextCnt > answer) answer = nextCnt
if (answer === filtered.length) return answer
dfs(nextEnergy, nextCnt)
visited[i] = false
}
}
dfs(k, 0)
return answer
}
より良い演技を披露する.
GItHub repo
Reference
この問題について([プログラマー]疲労度), 我々は、より多くの情報をここで見つけました https://velog.io/@catalyst88/프로그래머스-피로도テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol