https://school.programmers.co.kr/learn/courses/30/lessons/214289
손님이 택시에 탑승한 동안 특정 온도(t1 ~t2)를 유지하려 합니다.
에어컨을 통해 온도를 상승, 하강 시키는 경우 a만큼의 전력을, 온도를 유지하기 위해선 b 만큼의 전력을 소모합니다.
에어컨을 끌 경우 실외 온도temperature와 비교하여
1) 실외 온도 > 실내 온도일 경우 실내 온도는 상승
2) 실외 온도 < 실내 온도일 경우 실애 온돈느 하강
3) 실외 온도 === 실내 온도일 경우 유지
됩니다.
에어컨을 끈 경우 전력 소비는 없습니다.
손님이 탑승한 정보 (onboard)와 위의 정보가 주어질 때, 최소 전력 소비량을 구하세요.
dp를 통해 해결 가능합니다.
dp는 통해 1분 후의 특정 온도를
1) 에어컨을 킨 경우
2) 에어컨을 끈 경우
로 구분해 답을 구할 수 있습니다.
function solution(temperature, t1, t2, a, b, onboard) {
const INF = Infinity;
const n = onboard.length;
let answer = INF;
// 온도 범위 [-10,40] → [0,50]
temperature += 10;
t1 += 10;
t2 += 10;
// dp[시간][온도] = 소모 전력
const dp = Array.from({ length: n + 1 }, () => Array(51).fill(INF));
dp[0][temperature] = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j <= 50; j++) {
if (dp[i][j] === INF) continue;
if (onboard[i] === 1 && (j < t1 || j > t2)) continue;
// 에어컨 ON
if (j > 0) dp[i + 1][j - 1] = Math.min(dp[i + 1][j - 1], dp[i][j] + a); // 냉방
if (j < 50) dp[i + 1][j + 1] = Math.min(dp[i + 1][j + 1], dp[i][j] + a); // 난방
dp[i + 1][j] = Math.min(dp[i + 1][j], dp[i][j] + b); // 유지
// 에어컨 OFF
let nextTemp = j;
if (j > temperature) nextTemp--;
else if (j < temperature) nextTemp++;
dp[i + 1][nextTemp] = Math.min(dp[i + 1][nextTemp], dp[i][j]);
}
}
return Math.min(...dp[n]);
}