문제 출처

풀이 과정

전체 코드

def solution(실외온도, 하한온도, 상한온도, 불일치_소비전력, 일치_소비전력, 탑승_리스트):
    '''action: 에어컨 무가동/ 에어컨 현재 온도 유지/ 에어컨 온도 상승/ 에어컨 온도 하강'''
    실외온도 += 10   # DP 테이블 구현을 위하여, 실외온도/하한온도/상한온도를 조정함.
    하한온도 += 10
    상한온도 += 10
    최소_소비전력표 = [[1e+8 for _ in range(50+1)] for _ in range(1000)]  # DP 테이블
    최소_소비전력표[0][실외온도] = 0  # 0분에 실내온도(실외온도)로 이동하기 위한 소비전력은 0
    
    for 현재시간 in range(1, len(탑승_리스트)):  # DP 테이블 기록
        if 탑승_리스트[현재시간] == 0:   # 현재 시간에 승객이 탑승하지 않는 경우
				    시작온도, 종료온도 = min(실외온도, 하한온도), max(실외온도, 상한온도)
        else:   시작온도, 종료온도 = 하한온도, 상한온도
        for 목표온도 in range(시작온도, 종료온도+1):   # 현재 시간에 승객이 탑승하는 경우
            if 목표온도 < 실외온도:   
                if 목표온도 == 0:
                    최소_소비전력표[현재시간][0] = min(
                        최소_소비전력표[현재시간-1][0]+일치_소비전력,
                        최소_소비전력표[현재시간-1][1]+불일치_소비전력
                    )
                else:  # 0 < 목표온도 < 50
                    최소_소비전력표[현재시간][목표온도] = min(
                        최소_소비전력표[현재시간-1][목표온도-1],
                        최소_소비전력표[현재시간-1][목표온도]+일치_소비전력,
                        최소_소비전력표[현재시간-1][목표온도+1]+불일치_소비전력
                    )       
            elif 목표온도 > 실외온도:  # 실외온도가 아무리 높아도 50도가 될 수는 없음
                if 목표온도 == 50:
                    최소_소비전력표[현재시간][50] = min(
                        최소_소비전력표[현재시간-1][49]+불일치_소비전력, 
                        최소_소비전력표[현재시간-1][50]+일치_소비전력,
                    )
                else:  # 0 < 목표온도 < 50
                    최소_소비전력표[현재시간][목표온도] = min(
                        최소_소비전력표[현재시간-1][목표온도-1]+불일치_소비전력,
                        최소_소비전력표[현재시간-1][목표온도]+일치_소비전력,
                        최소_소비전력표[현재시간-1][목표온도+1]
                    )
            else: # 목표온도 == 실외온도
                if 목표온도 == 0:
                    최소_소비전력표[현재시간][0] = min(
                        최소_소비전력표[현재시간-1][0],
                        최소_소비전력표[현재시간-1][1]
                    )
                elif 목표온도 == 50:
                    최소_소비전력표[현재시간][50] = min(
                        최소_소비전력표[현재시간-1][49],
                        최소_소비전력표[현재시간-1][50]
                    )
                else:   # 0 < 목표온도 < 50
                    최소_소비전력표[현재시간][목표온도] = min(
                        최소_소비전력표[현재시간-1][목표온도-1],
                        최소_소비전력표[현재시간-1][목표온도],
                        최소_소비전력표[현재시간-1][목표온도+1]
                    )
                                                
    return min(최소_소비전력표[len(탑승_리스트)-1])