본문 바로가기
Algorithm/Dynamic Programming

[파이썬] 프로그래머스 : 에어컨 (Lv.3)

by 베짱이28호 2023. 8. 4.

[파이썬] 프로그래머스 : 에어컨 (Lv.3)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


풀이

0. 방향성 생각

1. 온도는 대칭적임. 상대적인 대소관계만 중요.

바깥 온도, t1이 0,5인 경우랑 바깥온도,t2가 20,25인 경우는 같다.

이후 인덱스 맞춰주기. 시작 온도를 0부터 매핑

 

2. 이전에 사용했던 전력량과 현재 상태 이용해서 전력량 계산 -> DP

 

1. 온도 매핑, DP 만들기

def solution(Tout,T1,T2,a,b,info):
    
    if Tout < T1 : Tout = T2 + (T1-Tout)
    T1,T2,Tout = 0,T2-T1,Tout-T1
    
    time_range = len(info)
    dp = [[10**5+1]*(Tout+1) for _ in range(time_range)]
    dp[0][-1] = 0

에어컨을 틀어서 시원하게 만드는게 조금 더 생각하기 쉬워서

실외온도가 T1보다 낮은 경우에는 실외온도를 T2 + T1-Tout으로 매핑시켰다.

그 후 T1,T2,Tout을 0부터 시작하게 매핑

T1~T2는 쾌적한 상태이다. T2보다 크면 쾌적하지 않은 상태.

 

DP 2차원 어레이 만들어준다. 온도 * 시간범위. dp[특정시간][특정온도]

초기화는 기존 onboard가 길이 최대가 1000, 전력 사용량이 최대 100이므로 10**5+1로 초기화

시작점은 time = 0이고 실내=실외, temp = Tout일 때, 전력 사용량을 0으로 맞춘다.

 

2. DP

    for time in range(1,time_range):
        for temp in range(Tout+1):
            
            if info[time]: # 사람 있으면 T1~T2
                if temp == T1: # 온도 하강 (on) / 온도 유지 (on)
                    dp[time][temp] = min(dp[time-1][temp+1]+a,dp[time-1][temp]+b)
                elif temp <= T2: # 온도 하강 (on) / 온도 유지 (on) / 온도 상승 (off)
                    dp[time][temp] = min(dp[time-1][temp+1]+a,dp[time-1][temp]+b,dp[time-1][temp-1])
                    
            else:
                if temp == T1: # 온도 하강 (on) / 온도 유지 (on)
                    dp[time][temp] = min(dp[time-1][temp+1]+a,dp[time-1][temp]+b)
                elif temp == Tout: # 온도 유지 (off) / 온도 상승 (off)
                    dp[time][temp] = min(dp[time-1][temp-1],dp[time-1][temp])
                else: # 온도 하강 (on) / 온도 유지 (on) / 온도 상승 (off)
                    dp[time][temp] = min(dp[time-1][temp+1]+a,dp[time-1][temp]+b,dp[time-1][temp-1])

    return min(dp[-1])

인덱스 에러가 나지 않게 경계값인 T1, Tout에서는 따로 처리를 해준다.

T1에서는 온도 유지(에어컨 on -> on : 희망온도), 온도 하강(에어컨 on -> on : 희망온도가 낮은 경우)

Tout에서는 온도 유지(에어컨 off->off), 온도 상승(에어컨 on -> off)

그 외 범위에서는 온도 하강(에어컨 on), 온도 유지(에어컨 on : 희망온도), 온도 상승 (에어컨 off)


전체코드

def solution(Tout,T1,T2,a,b,info):
    
    if Tout < T1 : Tout = T2 + (T1-Tout)
    T1,T2,Tout = 0,T2-T1,Tout-T1
    
    time_range = len(info)
    dp = [[10**5+1]*(Tout+1) for _ in range(time_range)]
    dp[0][-1] = 0
    
    for time in range(1,time_range):
        for temp in range(Tout+1):
            
            if info[time]: # 사람 있으면 T1~T2
                if temp == T1: # 온도 하강 (on) / 온도 유지 (on)
                    dp[time][temp] = min(dp[time-1][temp+1]+a,dp[time-1][temp]+b)
                elif temp <= T2: # 온도 하강 (on) / 온도 유지 (on) / 온도 상승 (off)
                    dp[time][temp] = min(dp[time-1][temp+1]+a,dp[time-1][temp]+b,dp[time-1][temp-1])
                    
            else:
                if temp == T1: # 온도 하강 (on) / 온도 유지 (on)
                    dp[time][temp] = min(dp[time-1][temp+1]+a,dp[time-1][temp]+b)
                elif temp == Tout: # 온도 유지 (off) / 온도 상승 (off)
                    dp[time][temp] = min(dp[time-1][temp-1],dp[time-1][temp])
                else: # 온도 하강 (on) / 온도 유지 (on) / 온도 상승 (off)
                    dp[time][temp] = min(dp[time-1][temp+1]+a,dp[time-1][temp]+b,dp[time-1][temp-1])

    return min(dp[-1])

 

댓글