광물 캐기

Lv. 2

Solution

export function mineForMinerals(picks: number[], minerals: string[]) {
  const totalPicks = picks.reduce((acc, curr) => acc + curr, 0);
 
  const getFatigue = (pick: number, mineral: string) => {
    const fatigue = mineral === 'diamond' ? 0 : mineral === 'iron' ? 1 : 2;
    return Math.max(Math.floor(5 ** pick / 5 ** fatigue), 1);
  };
 
  const getFatigues = (pick: number, startIndex: number) => {
    let fatigue = 0;
    for (let i = startIndex; i < Math.min(minerals.length, startIndex + 5); i++) {
      fatigue += getFatigue(pick, minerals[i]);
    }
    return fatigue;
  };
 
  let answer = Number.MAX_SAFE_INTEGER;
 
  const dfs = (used: number, i: number, fatigue: number) => {
    if (used === totalPicks || minerals.length <= i) {
      answer = Math.min(answer, fatigue);
      return;
    }
 
    for (let pick = 0; pick <= 2; pick++) {
      if (0 < picks[pick]) {
        picks[pick] -= 1;
        dfs(used + 1, i + 5, fatigue + getFatigues(pick, i));
        picks[pick] += 1;
      }
    }
  };
 
  dfs(0, 0, 0);
 
  return answer;
}