Patrick's Devlog

[BOJ/C++] 주식(11501번) 본문

Study/Algorithms Practice

[BOJ/C++] 주식(11501번)

Patrick_ 2023. 1. 13. 15:21

1. 개요

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

 

11501번: 주식

입력의 첫 줄에는 테스트케이스 수를 나타내는 자연수 T가 주어진다. 각 테스트케이스 별로 첫 줄에는 날의 수를 나타내는 자연수 N(2 ≤ N ≤ 1,000,000)이 주어지고, 둘째 줄에는 날 별 주가를 나타

www.acmicpc.net

1-1. 설명

홍준이는 그는 미래를 내다보는 눈이 뛰어나, 날 별로 주가를 예상하고 언제나 그게 맞아떨어진다. 매일 그는 아래 세 가지 중 한 행동을 한다.

 - 주식 하나를 삼

 - 원하는 만큼 가지고 있는 주식을 팜

 - 아무것도 안함

홍준이는 미래를 예상하는 뛰어난 안목을 가졌지만, 어떻게 해야 자신이 최대 이익을 얻을 수 있는지 모른다. 날 별로 주식 가격을 알려주었을 때, 최대 이익이 얼마나 되는지 계산하는 프로그램을 작성한다. 

1-2. 제한사항

 - 각 테스트 케이스가 주어지며, 테스트 케이스 별로 첫 줄에는 날의 수를 나타내는 N이 주어지며, N은 2 이상 1,000,000 이하

 - 둘째 줄에는 날별 주가를 나타내는 N개 자연수가 주어지며, 주가는 10,000이하


2. 구현

2-1. 풀이

첫 날부터 계산하는 것이 아닌 마지막 날부터 계산하면 정답이 쉽게 나온다. 다만 주의할 점은 자료형이다. integer 형으로 선언해 답이 틀려 살짝 헤맸었다. 1,000,000개의 최대 10,000 주가가 최대이므로, long long 형을 해주어야 한다. 

2-2. 코드

#include <iostream>
#include <algorithm>
using namespace std;

constexpr size_t MAX_NUM = 1000001;
int days[MAX_NUM];

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int T, N, maxNum = 0;
    long long result = 0;

    cin >> T;
    for (int tc = 0; tc < T; tc++) {
        cin >> N;

        maxNum = 0, result = 0;
        for (int i = 0; i < N; i++) cin >> days[i];
        
        for (int i = N - 1; i >= 0; i--) {
            if (days[i] < maxNum) {
                result += (maxNum - days[i]);
            }
            else if (days[i] > maxNum) maxNum = days[i];
        }
        cout << result << "\n";
    }
    return 0;
}