SWEA::1952 수영장

모의 SW역량테스트 문제이다.


나는 1일권,한달권 / 3달권 / 1년권 ---> 으로 3가지로 분할하여 풀었다.


dMonth배열에는 각각 달별로 min( 일수 x 1일이용권 ,  한달이용권 ) 을 저장하였고,

d[n] 에는 n번째날의 최소값을 갱신해나갔다.


예를들어 4일차 d[4]의 경우 가능한 값은

1. dMonth[1]+dMonth[2]+dMonth[3]+dMonth[4]

2. (1,2,3 3달이용권) + dMonth[4];

3. dMonth[1]+(2,3,4 3달 이용권)


3 가지 경우이다.

이를 토대로 점화식을 세워보면

d[n]=min( d[n-1] + dMonth[n] ,  d[n-3] + 3달이용권 ) 이 된다.

ex) n = 7 : d[6] + dMonth[7] : 6월 까지의 최소비용 + 7월 비용

             : d[4] + 3달이용권 : 4월까지의 최소비용 + 3달권 비용


d[n-3]이전의 경우들에 대해서는 d[n-3]에 이미 3달이용권에 대한 많은 경우들이 비교가 되면서 왔기 때문에 그전것까지 비교할 필요는 없다.


마지막으로 d[12]와 1년 이용권을 비교해주면 된다.



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
#include <stdio.h>
using namespace std;
 
int price[4];
int month[13];
int dMonth[13];
int d[13];
 
int min(int a, int b) {
    return (a < b) ? a : b;
}
 
int main() {
 
    int tc;
    scanf("%d"&tc);
 
    for (int t = 1; t <= tc; t++) {
        for (int i = 0; i < 4; i++) {
            scanf("%d"&price[i]);
        }
 
        for (int i = 1; i <= 12; i++) {
            scanf("%d"&month[i]);
        }
 
        //min(하루요금x일수, 한달요금)
        //1~12월 월간 최소값 저장
        for (int i = 1; i <= 12; i++) {
            dMonth[i] = min(price[0* month[i], price[1]);
        }
 
        //d[N]=N번째 날의 누적된 최소값
        for (int i = 1; i <= 12; i++) {
            d[i] = d[i - 1+ dMonth[i];
            if (i - 3 >= 0) {
                if (d[i] > d[i - 3+ price[2]) {
                    d[i] = d[i - 3+ price[2];
                }
            }
        }
 
        if (d[12> price[3]) {
            d[12= price[3];
        }
 
        printf("#%d %d\n", t, d[12]);
    }
}
cs


'SWEA::문제풀이' 카테고리의 다른 글

2105 디저트 카페  (0) 2018.01.21
2817 부분수열의 합  (0) 2018.01.19
1494 사랑의 카운슬러  (0) 2018.01.14
1265 달란트2  (0) 2018.01.10
1219 길찾기  (0) 2018.01.08

+ Recent posts