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

 

SW Expert Academy

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

www.swexpertacademy.com

1월부터 12월까지 모든 달에 대해서 1일권을 사용할지/1달권을 사용할지/3달권을 사용할지/ 1년권을 사용할지를

모두 해보면 되는데 1년권을 사용할 경우에는 한번에 12개월치를 다 정해주는거나 마찬가지이므로 정답에 미리 넣어놓고 다른 경우들과 비교해주면된다.

 

1일권을 이용하는 경우에는

해당 달의 이용일수X1월권 비용을 전체 비용에 더해준다.

 

1달권을 이용하는 경우에는 

해당 달에 몇번을 이용하든 상관없으므로 1달권의 비용만 더해주면 된다.

 

3달권을 이용하는 경우에는

마찬가지로 3달권의 비용만 더해주면 되는데 대신에 다음 두달치까지 계산되므로 (현재달 + 3)번째 달로 넘어가서 다시 비용을 계산해주면 된다.

 

모든 달에 대해서 계산해줬다면 총 비용을 비교하여 최댓값을 저장해주고 리턴한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
using namespace std;
 
int price[4];
int plan[13];
int ans;
 
void solve(int month, int sum) {
    if (month > 12) {
        if (ans > sum) ans = sum;
        return;
    }
 
 
    //이번 달에 수영장을 이용하지 않는 경우
    if (plan[month] == 0) {
        solve(month + 1, sum);
    }
    else {
 
        //1일 이용권을 사용하는 경우
        solve(month + 1, plan[month] * price[0+ sum);
        
        //1달 이용권을 사용하는 경우
        solve(month + 1, price[1+ sum);
 
        //3달 이용권을 사용하는 경우
        solve(month + 3, price[2+ sum);
 
    }
 
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    int T;
    cin >> T;
    for (int tc = 1; tc <= T; tc++) {
 
        for (int i = 0; i < 4; i++) {
            cin >> price[i];
        }
 
        for (int j = 1; j <= 12; j++) {
            cin >> plan[j];
        }
 
        ans = price[3];
        solve(10);
 
        cout << '#' << tc << ' ' << ans << '\n';
    }
 
    return 0;
}
Colored by Color Scripter
 

+ Recent posts