[ 백준 ] 2302 / 극장 좌석

金弘均·2021년 9월 16일
0

Baekjoon Online Judge

목록 보기
179/228
post-thumbnail
post-custom-banner

# Appreciation

/*
 * Problem :: 2302 / 극장 좌석
 *
 * Kind :: Dynamic Programming
 *
 * Insight
 * - 예제 입력 1
 *   N=9, VIP=4번,7번
 *   1 2 3 4 5 6 7 8 9
 *         V     V
 *   + 이는 다음과 같이 묶을 수 있다
 *     (1,2,3) 4 (5,6) 7 (8,9)
 *     # (1,2,3) - 3가지
 *       (5,6) - 2가지
 *       (8,9) - 2가지
 *       -> 3*2*2 = 총 12가지
 *
 * - VIP 가 앉지 않는 총 N 좌석이 연속해서 있을 때
 *   앉을 수 있는 방법의 가짓수는 몇개일까?
 *   + N=1 - 1가지
 *     N=2 - 2가지
 *     N=3 - 3가지
 *     N=4 - 5가지
 *     N=5 - 8가지
 *     ...
 *     # dp[i] = VIP 가 앉지 않는 총 i 좌석이 연속해서 있을 때 앉을 수 있는 방법의 가짓수
 *       dp[i] = dp[i-1] + dp[i-2]
 *       -> (1,2,3,4,5) 의 경우의 수는
 *          (1,2,3,4) 5 인 경우의 수와 <= 5번이 자기 좌석에 앉은 경우
 *          (1,2,3) (5 4) 인 경우의 수를 더한것이다 <= 5번이 옆 좌석에 앉은 경우
 *
 * Point
 * - 피보나치네...?
 *
 * - 문제의 친절함으로
 *   Overflow 를 걱정하지 않아도 된다!
 *   # int 면 충분해~
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Process
    int dp[40+1]; /* dp[i] = VIP 가 앉지 않는 총 i 좌석이
                   *         연속해서 있을 때 앉을 수 있는 방법의 가짓수 */
    dp[0] = dp[1] = 1;
    dp[2] = 2;
    for (int i=3; i<=40; i++) {
        dp[i] = dp[i-1] + dp[i-2];
    }

    // Set up : Input
    int N; cin >> N;
    int M; cin >> M;
    int V[M+2];
    /* 편의상 다음과 같이 생각함
     * 1 2 3 4 5 6 7 8 9
     *       V     V
     * => (1,2,3) 4 (5,6) 7 (8,9)
     *
     * |
     * V
     *
     * 0 1 2 3 4 5 6 7 8 9 10
     * V       V     V      V
     * => 0 (1,2,3) 4 (5,6) 7 (8,9) 10
     */
    V[0] = 0;
    V[M+1] = N+1;
    for (int i=1; i<=M; i++) {
        cin >> V[i];
    }

    // Process
    int ans = 1;
    for (int i=0; i<=M; i++) {
        int s = V[i]+1; /* 현재 VIP 오른쪽 좌석 */
        int e = V[i+1]-1; /* 다음 VIP 왼쪽 좌석 */
        int n = e-s+1; /* VIP 가 앉지 않는 연속한 좌석의 개수 */
        ans *= dp[n];
    }

    // Control : Output
    cout << ans << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이
post-custom-banner

0개의 댓글