본문 바로가기

백준/DP

백준 14720 - 우유 축제

728x90
728x90

https://www.acmicpc.net/problem/14720

 

14720번: 우유 축제

영학이는 딸기우유, 초코우유, 바나나우유를 좋아한다. 입맛이 매우 까다로운 영학이는 자신만의 우유를 마시는 규칙이 있다. 맨 처음에는 딸기우유를 한 팩 마신다. 딸기우유를 한 팩 마신 후에는 초코우유를 한 팩 마신다. 초코우유를 한 팩 마신 후에는 바나나우유를 한 팩 마신다. 바나나우유를 한 팩 마신 후에는 딸기우유를 한 팩 마신다.  영학이는 우유 축제가 열리고 있는 우유거리에 왔다. 우유 거리에는 우유 가게들이 일렬로 늘어서 있다. 영학이는 우유 거리

www.acmicpc.net

 

영학이가 우유를 마시는 규칙에 따라 각 상태를 기억하는 방식으로 우유 가게를 순회하면 쉽게 풀 수 있다.

 

다음과 같은 배열을 구성해보자.

int milk[3] {1, 2, 0};

이는 영학이가 0, 1, 2 중 한가지의 우유를 마셨을 때 다음 우유는 어떤 것을 먹어야 하는지 나타내는 배열이다.

 

이 배열을 이용해 입력을 순회하는 함수를 구성하면 쉽게 해결할 수 있다.

int travel(int idx, int next, vector<int> &shop, int ret)
{
    int range(shop.size());
    
    // 상점을 모두 지나친 경우 return
    if (idx == range)
        return ret;
    
    // 규칙에 따라 우유를 먹었는지에 따라 재귀함수 호출
    if (shop[idx] == next)
        return travel(idx + 1, milk[next], shop, ret + 1);
    else
        return travel(idx + 1, next, shop, ret);
}

 

전체 코드

#include <iostream>
#include <vector>

using namespace std;

int milk[3] {1, 2, 0};

int travel(int idx, int next, vector<int> &shop, int ret);

int main()
{
    int n; cin >> n;
    vector<int> store(n);
    
    for (int i = 0; i < n; ++i)
        cin >> store[i];
    
    cout << travel(0, 0, store, 0);
}

int travel(int idx, int next, vector<int> &shop, int ret)
{
    int range(shop.size());
    
    if (idx == range)
        return ret;
        
    if (shop[idx] == next)
        return travel(idx + 1, milk[next], shop, ret + 1);
    else
        return travel(idx + 1, next, shop, ret);
}

 

 

728x90
728x90

'백준 > DP' 카테고리의 다른 글

백준 2624 - 동전 바꿔주기  (0) 2020.05.19
백준 3980 - 선발 명단  (0) 2020.05.18
백준 15468 - 퇴사 2  (0) 2020.05.13
[USACO] 백준 5864 - Wifi Setup  (0) 2020.05.13
백준 10217 - KCM Travel  (0) 2019.09.08