문제 출처 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpFQaAQMDFAUq&categoryId=AV5PpFQaAQMDFAUq&categoryType=CODE&problemTitle=%EC%88%98%EC%98%81%EC%9E%A5&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

🔥 작성코드

T = int(input())

for test_case in range(1, T+1):
    d, m, m3, y = map(int, input().split())
    lst = list(map(int, input().split()))

    dp = [0 for _ in range(12)]

    dp[0] = min(lst[0]*d, m)
    for i in range(1, 12):
        if i == 11:
            dp[i] = min(dp[i-1]+lst[i]*d, dp[i-1]+m, dp[i-3]+m3, y)
        elif i >= 3:
            dp[i] = min(dp[i-1]+lst[i]*d, dp[i-1]+m, dp[i-3]+m3)
        elif i == 2:
            dp[i] = min(dp[i-1]+lst[i]*d, dp[i-1]+m, m3)
        else:
            dp[i] = min(dp[i-1]+lst[i]*d, dp[i-1]+m)

    print(f'#{test_case} {dp[11]}')

 

⭕ 해설

  1. 첫째 달부터 마지막 달까지 최소 누적합을 저장해나갔습니다.
  2. 처음(dp[0] == 첫 번째 달)에는 한 달 입장료와 하루 입장료*입장한 날을 비교하여 최솟값을 저장
  3. 다음부터는 이전달에 저장된 최소값에 이번달에 내야하는 최소값을 저장해나가줍니다.
  4. 3월 이후로는 비교해야 할 값(3개월 이용권)이 하나 더 생기고 12월에는 연간이용권을 고려해줍니다. 

+ Recent posts