[ 백준 ] 2847 / 게임을 만든 동준이

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
44/228
post-thumbnail

# Appreciation

/*
 * Problem :: 2847 / 게임을 만든 동준이
 *
 * Kind :: Greedy
 *
 * Insight
 * - A = {a1, a2, ..., an} 이라고 할 때
 *   i=1~N 에서 A[i] >= A[i+1] 이면
 *   레벨 i 의 점수 A[i] 가 A[i+1]-1 이 되게끔 만들어주고
 *   그 차이의 합을 구하면 되지 않을까?
 *   + 위대로 하면 예제 입력에서
 *     A = {5, 3, 7 ,5} -> {2, 3, 4, 5}
 *     올바르게 계산해주니 이렇게 하면 되겠다
 *     # 틀렸네...
 *       9 8 7 6 5
 *       이런 경우가 있을 수도 있겠구나
 *       -> 점수를 줄일 수만 있다
 *          마지막 원소 an 이 최대가 되어야 한다
 *          i=1~N 이 아니라 i=N~1 순서로 순회했어야 했구나!
 *
 * Point
 * - 점수를 1만큼 감소시키는 것이 1번
 *   + 즉, 감소된 점수와 감소시킨 횟수는 동일하다
 */

# 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);

    // Set up : Input
    int N; cin >> N;
    int A[N];
    for (int i=0; i<N; i++)
        cin >> A[i];

    // Process
    int ans = 0;
    for (int i=N-2; i>=0; i--) {
        if (A[i] >= A[i+1]) {
            /* i 레벨 점수 A[i] 는 A[i+1]-1 로 감소되어야 함 */
            ans += A[i] - (A[i+1]-1); /* 감소시킨 점수의 양 = 점수를 감소시킨 횟수 */
            A[i] = A[i+1]-1;
        }
    }

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

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

0개의 댓글