해당 문제는 여기에서 확인하실 수 있습니다.
class Solution {
public int solution(int temperature, int t1, int t2, int a, int b, int[] onboard) {
int MAX_COST = 1000 * 100; // 최대 비용을 정의
int OFFSET = 10; // 온도 조정을 위한 오프셋
// 목표 온도와 임계값을 조정
int adjustedT1 = t1 + OFFSET;
int adjustedT2 = t2 + OFFSET;
int adjustedTemperature = temperature + OFFSET;
int numberOfOnboardUnits = onboard.length; // 탑재된 장치의 수
int maxTemperature = 51; // 최대 온도 범위
int[][] dp = new int[numberOfOnboardUnits][maxTemperature];
// dp 배열을 최대 비용으로 초기화
for (int i = 0; i < numberOfOnboardUnits; i++) {
for (int j = 0; j < maxTemperature; j++) {
dp[i][j] = MAX_COST;
}
}
dp[0][adjustedTemperature] = 0; // 시작 상태의 비용은 0
int direction = 1; // 온도 변화 방향
// 목표 온도와 현재 온도를 비교하여 방향 설정
if (adjustedTemperature > adjustedT2) {
direction = -1; // 현재 온도가 목표 온도보다 높으면 감소 방향
}
// 각 장치에 대해 dp 배열을 채우기
for (int i = 1; i < numberOfOnboardUnits; i++) {
for (int j = 0; j < maxTemperature; j++) {
int minCost = MAX_COST; // 현재 최소 비용 초기화
// 장치가 온도를 조절할 수 있는지 확인
if ((onboard[i] == 1 && adjustedT1 <= j && j <= adjustedT2) || onboard[i] == 0) {
// 현재 온도에서 한 단계 이동 가능
if (0 <= j + direction && j + direction < maxTemperature) {
minCost = Math.min(minCost, dp[i - 1][j + direction]);
}
// 현재 온도를 유지할 경우의 비용
if (j == adjustedTemperature) {
minCost = Math.min(minCost, dp[i - 1][j]);
}
// 온도를 변경할 경우의 비용
if (0 <= j - direction && j - direction < maxTemperature) {
minCost = Math.min(minCost, dp[i - 1][j - direction] + a);
}
// 목표 온도 범위 내에 있는 경우의 비용
if (adjustedT1 <= j && j <= adjustedT2) {
minCost = Math.min(minCost, dp[i - 1][j] + b);
}
dp[i][j] = minCost; // dp 배열 업데이트
}
}
}
// 마지막 장치에서 가능한 최소 비용을 계산
int finalCost = dp[numberOfOnboardUnits - 1][0];
for (int j = 1; j < maxTemperature; j++) {
finalCost = Math.min(finalCost, dp[numberOfOnboardUnits - 1][j]);
}
return finalCost; // 최소 비용 반환
}
}