ํ”ผ๋กœ๋„

Deadline
Apr 30, 2022
Status
Archived
Type
BFS
DFS
Permutation

๋ฌธ์ œ

notion image
notion image
notion image
notion image
 

ํ’€์ด

์€์ฐฌ
function solution(k, dungeons) { let answer = 0; const {length} = dungeons; const array = []; const nums = []; const dfs = (arr, acc) => { if(!arr.length){ array.push(acc); return; } arr.forEach((n, index) => { const copy = arr.slice(); copy.splice(index, 1); dfs(copy, acc.concat(n)); }); } for(let i = 0; i < length; i++){ nums.push(i); } dfs(nums, []); for(let i = 0; i < array.length; i++){ let currentK = k; let count = 0; array[i].forEach((val) => { if(currentK >= dungeons[val][0]){ currentK -= dungeons[val][1]; count++; } }); answer = answer < count ? count : answer; } return answer; }
์žฌ์˜

๋ฆฌํŒฉํ† ๋ง ์ „

(worst: 9000ms)
const solution = (k, dungeons) => { let maxCount = 0; const dungeonsCount = dungeons.length; // ๋˜์ „ ๊ธธ์ด const queue = []; // ํ ์ƒ์„ฑ // ํ ์ดˆ๊ธฐํ™” for (let i = 0; i < dungeonsCount; i += 1) { const [minFatigue, fatigueCost] = dungeons[i]; if (k >= minFatigue) { queue.push([k - fatigueCost, 1, [i]]); // ํ˜„์žฌ ํ”ผ๋กœ๋„, ๋“ค์–ด๊ฐ„ ๋˜์ „ ์ˆ˜, Visited } } while (queue.length) { if (maxCount === dungeonsCount) return maxCount; // ๋” ํƒ์ƒ‰ํ•  ์ด์œ  x -> early return const [nowFatigue, nowCount, visited] = queue.shift(); if (visited.length === dungeonsCount) { // ๋‹ค ๋ฐฉ๋ฌธ ์‹œ -> ๋น„๊ต ํ›„ ์—…๋ฐ์ดํŠธ if (maxCount < nowCount) { maxCount = nowCount; } continue; } for (let i = 0; i < dungeonsCount; i += 1) { if (visited.includes(i)) continue; const [minFatigue, fatigueCost] = dungeons[i]; if (nowFatigue >= minFatigue) { queue.push([nowFatigue - fatigueCost, nowCount + 1, [...visited, i]]); } else { queue.push([nowFatigue, nowCount, [...visited, i]]); } } } return maxCount; }; (() => { const k = 80; const dungeons = [ [80, 20], [50, 40], [30, 10], ]; console.log(solution(k, dungeons)); })();
 

๋ฆฌํŒฉํ† ๋ง

worst: 113ms
  1. ํ ํด๋ž˜์Šค ๊ตฌํ˜„
  1. visited๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด๋กœ ์ƒ์„ฑ
  1. ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ ๋†’์ž„
class Queue { constructor() { this.arr = []; this.front = 0; this.rear = 0; this.length = 0; } push(val) { this.arr.push(val); this.rear += 1; this.length += 1; } shift() { if (this.length) { const value = this.arr[this.front]; delete this.arr[this.front]; this.front += 1; this.length -= 1; return value; } } } const solution = (k, dungeons) => { let maxCount = 0; const dungeonsCount = dungeons.length; const queue = new Queue(); const makeVisited = (count) => new Array(count).fill(false); for (let i = 0; i < dungeonsCount; i += 1) { const [minFatigue, fatigueCost] = dungeons[i]; if (k >= minFatigue) { const visited = makeVisited(dungeonsCount); visited[i] = true; queue.push([k - fatigueCost, 1, visited]); } } while (queue.length) { if (maxCount === dungeonsCount) return maxCount; const [nowFatigue, nowCount, visited] = queue.shift(); if (visited.every((v) => v)) { if (maxCount < nowCount) maxCount = nowCount; continue; } for (let i = 0; i < dungeonsCount; i += 1) { if (visited[i]) continue; const [minFatigue, fatigueCost] = dungeons[i]; const nextVisited = visited.map((value, idx) => idx === i || value); queue.push( nowFatigue >= minFatigue ? [nowFatigue - fatigueCost, nowCount + 1, nextVisited] : [nowFatigue, nowCount, nextVisited] ); } } return maxCount; };
ํšจ์„ฑ
function solution(k, dungeons) { const answer = []; const pushVisitCnt = (arr) => { let cnt = 0; let rest = k; arr.forEach(dungeon => { const [min, lost] = dungeon; if(rest >= min) { cnt++; rest -= lost; } }); answer.push(cnt); } const getPermutations = (arr, selectNumber) => { const results = []; if (selectNumber === 1) { return arr.map((value) => [value]); } arr.forEach((fixed, index, origin) => { const rest = [...origin.slice(0, index), ...origin.slice(index + 1)]; const permutations = getPermutations(rest, selectNumber - 1); const attached = permutations.map((el) => [fixed, ...el]); results.push(...attached); }); return results; } const permutatedDungeons = getPermutations(dungeons, dungeons.length); permutatedDungeons.forEach(permutatedDungeon => { pushVisitCnt(permutatedDungeon); }); return Math.max(...answer); }