문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/214289
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
바텀업 DP로 풀었습니다.
cache[분][온도] 이차원 배열은 현재 분에 온도를 유지하기 위해 소모된 최소 전력을 표현하며 반복문을 통해 cache 배열을 업데이트했습니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
#include <vector> | |
#include <algorithm> | |
#include <iostream> | |
using namespace std; | |
const int INF = 987654321; | |
const int MAX = 1e3 + 10; | |
const int TEMPERATURE_RANGE = 50; | |
int cache[MAX][TEMPERATURE_RANGE + 1]; | |
int solution(int temperature, int t1, int t2, int a, int b, vector<int> onboard) { | |
if (temperature >= t1 && t2 >= temperature) | |
{ | |
return 0; | |
} | |
temperature += 10; | |
t1 += 10; | |
t2 += 10; | |
for (int i = 0; i < MAX; i++) | |
{ | |
for (int j = 0; j <= TEMPERATURE_RANGE; j++) | |
{ | |
cache[i][j] = INF; | |
} | |
} | |
cache[0][temperature] = 0; | |
for (int i = 0; i < onboard.size() - 1; i++) | |
{ | |
for (int j = 0; j <= TEMPERATURE_RANGE; j++) | |
{ | |
// 기저 사례: 손님이 탑승했을 때는 온도 조건을 충족해야 함 | |
if (onboard[i] && | |
(t1 > j || j > t2)) | |
{ | |
continue; | |
} | |
int nextTemperature = j; | |
if (j < temperature && j < TEMPERATURE_RANGE) | |
{ | |
nextTemperature++; | |
} | |
else if (j > temperature && j > 0) | |
{ | |
nextTemperature--; | |
} | |
// 에어컨 껐을 때 | |
cache[i + 1][nextTemperature] = min(cache[i + 1][nextTemperature], cache[i][j]); | |
// 에어컨을 켰고 온도 변화가 있을 때 | |
if (j > 0) | |
{ | |
cache[i + 1][j - 1] = min(cache[i + 1][j - 1], a + cache[i][j]); | |
} | |
if (j < TEMPERATURE_RANGE) | |
{ | |
cache[i + 1][j + 1] = min(cache[i + 1][j + 1], a + cache[i][j]); | |
} | |
// 에어컨을 켰고 온도 변화가 있을 때 | |
// 에어컨을 켰고 온도 유지 중일 때 | |
cache[i + 1][j] = min(cache[i + 1][j], b + cache[i][j]); | |
} | |
} | |
int result = INF; | |
int len = onboard.size(); | |
for (int j = 0; j <= TEMPERATURE_RANGE; j++) | |
{ | |
if (onboard[len - 1] == 1 | |
&& (t1 > j || j > t2)) | |
{ | |
continue; | |
} | |
result = min(result, cache[len - 1][j]); | |
} | |
return result; | |
} |

개발환경: Programmers IDE
지적, 조언, 질문 환영합니다! 질문 남겨주세요~
반응형
'알고리즘 > programmers' 카테고리의 다른 글
[Programmers] 무지의 먹방 라이브 (0) | 2024.07.23 |
---|---|
[Programmers] 조건에 맞는 사원 정보 조회하기 (0) | 2024.06.02 |
[Programmers] 분기별 분화된 대장균의 개체 수 구하기 (2) | 2024.05.25 |
[Programmers] 상담원 인원 (0) | 2024.05.08 |
[Programmers] 표현 가능한 이진트리 (0) | 2024.05.08 |