코딩 테스트 공부

Lv. 3

Solution

export function studyCodingTest(alp: number, cop: number, problems: number[][]): number {
  const [maxAlp, maxCop] = problems.reduce(
    ([prevAlp, prevCop], [alpReq, copReq]) => [
      Math.max(prevAlp, alpReq),
      Math.max(prevCop, copReq),
    ],
    [alp, cop],
  );
  if (maxAlp === alp && maxCop === cop) {
    return 0;
  }
 
  const dp = Array.from({ length: maxAlp + 1 }).map(() =>
    new Array(maxCop + 1).fill(Number.MAX_SAFE_INTEGER),
  );
  dp[alp][cop] = 0;
  problems.push([0, 0, 1, 0, 1], [0, 0, 0, 1, 1]);
 
  for (let curAlp = alp; curAlp <= maxAlp; curAlp++) {
    for (let curCop = cop; curCop <= maxCop; curCop++) {
      if (curAlp === maxAlp && curCop === maxCop) {
        continue;
      }
      for (const [alpReq, copReq, alpRwd, copRwd, cost] of problems) {
        if (curAlp < alpReq || curCop < copReq) {
          continue;
        }
        const nextAlp = Math.min(curAlp + alpRwd, maxAlp);
        const nextCop = Math.min(curCop + copRwd, maxCop);
        const nextCost = dp[curAlp][curCop] + cost;
        if (nextCost < dp[nextAlp][nextCop]) {
          dp[nextAlp][nextCop] = nextCost;
        }
      }
    }
  }
 
  return dp[maxAlp][maxCop];
}