[programmers/js] 에어컨

승민·2025년 5월 10일

알고리즘

목록 보기
169/171

에어컨

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]);
}

0개의 댓글