새소식

Algorithm Review/Programmers

[C++ 2023 현대모비스 알고리즘 경진대회 예선] 에어컨

  • -

에어컨

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/214289

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

프로그래머스에 있는 2023 현대모비스 알고리즘 경진대회 예선 문제이다.

문제제목과 같이 실내온도를 희망온도에 맞춰주는 문제이다. 이 때 희망온도를 유지하기 위한 최소한의 전력 사용량을 구해야 한다.

 

승객이 탑승했을 때 반드시 실내온도가 희망온도 사이여야 하는 조건이 있고, 최종적으로 최소 전력사용량을 구해야하기 때문에 dp로 접근했다. onboard길이, 변화가능한 온도 range로 이중 for문 만들고, i-1 시간에서 i 시간으로 갈 때 최소 전력사용가능한 시나리오를 min으로 선택해주었다.

승객이 탑승 중일 때 실내온도가 t1 보다 낮거나 t2 보다 높으면 실패한 경우이기 때문에 해당 값은 패쓰

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int dp[1005][55];
int mx = 2000000000;
int solution(int temperature, int t1, int t2, int a, int b, vector<int> onboard) {
    temperature += 10;
    t1 += 10;
    t2 += 10;
    for(int i = 0; i < 1005; i++) {
        for(int j = 0; j < 55; j++) {
            dp[i][j] = mx;
        }
    }
    int chk = 0;
    for(int i = 1; i < onboard.size(); i++) {
        if(onboard[i] == 1) {
            chk = i;
        }
    }
    dp[0][temperature] = 0;
    for(int i = 1; i < onboard.size(); i++) {
        for(int j = 0; j <= 50; j++) {
            if(onboard[i] == 1) {
                if(j < t1) {
                    continue;
                }
                if(j > t2) {
                    continue;
                }
            }
            if(j < temperature) {
                if(j == 0) {
                    dp[i][j] = min(dp[i-1][j]+b,dp[i-1][j+1]+a);
                    continue;
                }
                dp[i][j] = min({dp[i-1][j]+b,dp[i-1][j+1]+a,dp[i-1][j-1]});
            }
            else if(j > temperature){
                if(j == 0) {
                    dp[i][j] = min(dp[i-1][j]+b,dp[i-1][j+1]);
                    continue;
                }
                dp[i][j] = min({dp[i-1][j]+b,dp[i-1][j+1],dp[i-1][j-1]+a});
            }
            else {
                if(j == 0) {
                    dp[i][j] = min(dp[i-1][j],dp[i-1][j+1]);
                    continue;
                }
                dp[i][j] = min({dp[i-1][j],dp[i-1][j+1],dp[i-1][j-1]});
            }
        }
    }
    //cout << t1 << " " << t2 << "\n";
    for(int i = t1; i <= t2; i++) {
        if(mx > dp[chk][i]) {
            mx = dp[chk][i];
        }
        //cout << i << " "<< dp[chk][i] << "\n";
    }
    int answer = 0;
    answer = mx;
    return answer;
}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.