꾸르꾸르

[SW Expert Academy] 1952. [모의 SW 역량테스트] 수영장 풀이 (C++) 본문

코딩, 알고리즘, 문제풀이/SW Expert Academy

[SW Expert Academy] 1952. [모의 SW 역량테스트] 수영장 풀이 (C++)

GGUGGU- 2020. 4. 25. 13:58

2017. 10. 7에 쓰여진 글입니다.


문제링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpFQaAQMDFAUq&categoryId=AV5PpFQaAQMDFAUq&categoryType=CODE

 

SW Expert Academy

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

swexpertacademy.com

 

풀이방법

dp로 짜자잔 하고 풀면 풀림.. 자세한건 코드 내 주석을 참고

 

소스코드

#include <iostream>
#include <algorithm>
 
#define MONTH 12
#define TYPE 4
 
enum { DAY_USE, MONTH_USE, TH_MONTH_USE, YEAR_USE };
 
using namespace std;
 
int price[TYPE];//1일 1달 3달 12달
int day[MONTH + 1];//1~12월 매월 이용일수
 
int main()
{
    int T, Answer;
    cin >> T;
    for (int test_case = 1; test_case <= T; test_case++) {
        Answer = 0;
        int dp[MONTH + 1] = { 0 };    //각 달마다 최소 이용가격 저장
                                    //dp[1] 1월까지 최소이용가격
                                    //dp[2] 2월까지 최소이용가격
                                    //...
                                    //dp[12] 1월까지 최소이용가격
        for (int i = 0; i < TYPE; i++)
            cin >> price[i];    //1일 1달 3달 1년 가격 저장
        for (int i = 1; i <= MONTH; i++)
            cin >> day[i];        //매월 이용일수 저장
        for (int i = 1; i <= MONTH; i++) {
            dp[i] = dp[i - 1] + min(price[MONTH_USE], day[i] * price[DAY_USE]);    //1일권*이용일수랑 1달이용권이랑 더 싼 가격을 저장
            if (i >= 3)
                dp[i] = min(dp[i], dp[i - 3] + price[TH_MONTH_USE]);        //3달이용권가격을산게더싸면 이걸저장
        }
        Answer = min(dp[MONTH], price[YEAR_USE]);    //12월까지 최소가격이랑 1년치까지 최소가격비교
        cout << "#" << test_case << " " << Answer << endl;
    }
    
    return 0;
}
Comments