코딩 테스트 공부
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];
}