문제 출처
풀이 과정
전체 코드
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])
Python
복사