[ 백준 ] 11501 / 주식

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

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

# Appreciation

/*
 * Problem :: 11501 / 주식
 *
 * Kind :: Greedy
 *
 * Insight
 * - 싸게사서 비싸게 팔아야 한다
 *   언제 사야되고 언제 팔아야 하지?
 *   + 8
 *     3 2 1 9 1 8 1 7
 *     1 2 3 4 5 6 7 8 - 날 수
 *     # 1 일에 사고 4 일에 팔아야 한다
 *       5 일에 사고 6 일에 팔아야 한다
 *       7 일에 사고 8 일에 팔아야 한다
 *       -> 1일, 2일, 3일, ... 이렇게 앞에서부터 차례로 본다면
 *          [1일 ~ 8일] 에서 최대 주가인 날에 1일부터 산 모든 주식을 팔아야 한다
 *          그 후, [5일 ~ 8일] 에서 최대 주가인 날에 3일부터 산 모든 주식을 팔아야 한다
 *          그 후, [7일 ~ 8일] 에서 최대 주가인 날에 5일부터 산 모든 주식을 팔아야 한다
 *          => 각 구간의 최대 주가인 날을 어떻게 알아내지...?
 *
 * - 위에서 각 구간의 마지막 날은 항상 같다 (N일, 위에는 N=8 인 경우)
 *   + N일, (N-1)일, (N-2)일, ... 이렇게 거꾸로 바라볼 수도 있지 않을까?
 *     위의 입력을 그대로 사용한다면
 *     # 7               - 8일 (최대 주가 = 7)
 *       7 1             - 7일 (최대 주가 = 7)
 *       7 1 8           - 6일 (최대 주가 = 8)
 *       7 1 8 1         - 5일 (최대 주가 = 8)
 *       7 1 8 1 9       - 4일 (최대 주가 = 9)
 *       7 1 8 1 9 1     - 3일 (최대 주가 = 9)
 *       7 1 8 1 9 1 2   - 2일 (최대 주가 = 9)
 *       7 1 8 1 9 1 2 3 - 1일 (최대 주가 = 9)
 *       -> [8일 ~ 7일] 최대 주가 = 7
 *          [6일 ~ 5일] 최대 주가 = 8
 *          [4일 ~ 1일] 최대 주가 = 9
 *          => 각 날마다 모두 주식을 사서
 *             현재 최대 주가로 팔면 최대이익이다!
 *             (현재 날의 주가가 최대 주가라면 이익은 0 이다)
 */

# 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 T; cin >> T;

    while (T--) {
        int N; cin >> N;
        int A[N];
        for (int i=0; i<N; i++)
            cin >> A[i];

        // Process
        long ans = 0;
        int mx = -1; /* 현재 최대 주가 */
        for (int i=N-1; i>=0; i--) {
            mx = max(mx, A[i]); /* 최대 주가 갱신 */
            ans += mx-A[i]; /* 현재 날에 주식을 사서 현재 최대 주가로 팔기 */
        }

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

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

0개의 댓글