본문 바로가기

Notice
Recent Posts
Recent Comments
«   2024/05   »
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
Tags
더보기
Archives
관리 메뉴

14720. 우유 축제 본문

알고리즘 문제풀기/백준(Acmicpc)

14720. 우유 축제

알광(Algwang) 2019. 1. 15. 11:37

문제링크 : https://www.acmicpc.net/problem/14720


< 입력 >


우유 가게 수 n


n개의 가게 정보 ( 0 : 딸기우유, 1 : 초코우유, 2 : 바나나우유 )


< 출력 >


최대로 마실 수 있는 우유의 개수


< 풀이 >


역시 단순한 dp 문제이다.


0(딸기우유)번 가게일 경우 이전의 2(바나나우유)번 가게의 값 중 Max +1을 하고


1(초코우유)번 가게는 이전의 0(딸기우유)번 가게의 값 중 Max +1,


2(바나나우유)번 가게는 이전의 1(초코우유)번 가게의 값 중 Max +1을 하면 된다.


여기서 주의해야할 예외는 1. 맨 처음에는 딸기우유를 한 팩 마신다. 이다.


즉, 1과 2가 나오더라도 0이 나오기 전이라면 값을 갱신해서는 안된다.


예외처리를 해줘야 하는 경우는 2가지이다.


1) 0이 나왔을 때만 dp값을 1로 바꿔준다.


2) 1혹은 2가 나왔을 때 이전의 값을 확인하게 된다. 이 때, 이전의 dp값이 0이 아닐 경우만 확인한다.




- 소스 코드 -

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
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int main(void){
    int arr[1002= {0}; // 무슨 우유인지 받을 배열
    int dp[1002= {0};
    int n;
    cin >> n;
 
    for (int i = 0; i < n; i++){
        scanf("%d"&arr[i]);
    }
    for (int i = 0; i < n; i++){
        if (dp[i] == 0 && arr[i] == 0){
            dp[i] = 1;
            // 가장 먼저 딸기우유를 마셔야 한다. (예외1)
            // 따라서 dp가 0이지만 arr도 0일 경우만 1로 만들어준다.
        }
        for (int j = i - 1; j >= 0; j--){
            if (dp[j] != 0){
            // 가장 먼저 딸기우유를 마셔야한다.(예외1)
            // 따라서 아무리 이전 순서인 우유가 있어도 딸기우유가 나오기 전에는
            // 먹지 못한다.(예외2)
                if (arr[i] == 2){
                    if (arr[j] == 1){
                        dp[i] = max(dp[i], dp[j] + 1);
                    }
                }
                else if (arr[i] == 1){
                    if (arr[j] == 0){
                        dp[i] = max(dp[i], dp[j] + 1);
                    }
                }
                else{
                    if (arr[j] == 2){
                        dp[i] = max(dp[i], dp[j] + 1);
                    }
                }
            }
        }
    }
    int result = 0;
    for (int i = 0; i < n; i++){
        // printf("%d ", dp[i]);
        result = max(result, dp[i]);
    }
    // cout << endl;
    cout << result << endl;
}
cs




'알고리즘 문제풀기 > 백준(Acmicpc)' 카테고리의 다른 글

11060. 점프 점프  (0) 2019.01.18
10164. 격자상의 경로  (0) 2019.01.17
11727. 2×n 타일링 2  (0) 2019.01.15
1967. 트리의 지름  (0) 2019.01.14
1008. A/B  (0) 2018.12.30
Comments