처음에 스택으로 가격을 저장하다가, 오르막 -> 내리막이 나오는 시점에 파는 방식으로 구현하였으나 실패했다.
마지막날 값을 max로 하여 뒤에서부터 거슬러오면서 max 값보다 작으면 차이를 더해주고, 아니면 max 인덱스를 갱신해주는 방식으로 풀 수 있었다.
#include<iostream>
#include <algorithm>
#define MAX 1000004
using namespace std;
int N;
int arr[MAX];
void init()
{
fill(arr, arr + MAX, 0);
}
void input()
{
cin >> N;
for(int i=0; i<N; i++)
{
cin >> arr[i];
}
}
long long solve()
{
long long result = 0;
int max_day = N-1;
for(int i=N-2; i>=0; i--)
{
if (arr[i] <= arr[max_day])
{
result += arr[max_day] - arr[i];
}
else
{
max_day = i;
}
}
return result;
}
void output(int test_case)
{
cout << "#" << test_case << " " << solve() << "\n";
}
int main(int argc, char** argv)
{
int test_case;
int T;
cin >> T;
for(test_case = 1; test_case <= T; ++test_case)
{
init();
input();
output(test_case);
}
return 0;
}
무조건 앞으로 탐색해야한다는 편견을 버리기