[ 백준 ] 11501 / 주식
# 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 */
Author And Source
이 문제에 관하여([ 백준 ] 11501 / 주식), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@gglifer/백준-11501-주식
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
/*
* 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 이다)
*/
//
// 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 */
Author And Source
이 문제에 관하여([ 백준 ] 11501 / 주식), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gglifer/백준-11501-주식저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)