컴굥일지
[BOJ/백준 11501][C++] 주식 본문
반응형
문제
https://www.acmicpc.net/problem/11501
문제 내용
날 별로 주식의 가격이 주어진다.
이때 우리는 주식을 사거나 / 팔거나 / 아무것도 안 하거나 3가지 중에 골라야 한다.
최대 이익을 만들어 결과를 출력하면 된다.
문제 풀이
문제를 읽고 나서 가장 먼저 떠오르는 것은 앞에서부터 차례로 확인해나가는 방법이었다.
현재 구입하는 시점 이후에 가장 비쌀 때 팔아버리면 된다.
현재 구입 시점이 가장 비싸다면 사지 않으면 된다.
다만, 이 방법은 구현하기가 어려웠다.
현재 구입하는 시점 이후 중, 가장 비싼 때를 찾기가 어렵기 때문이다.
그래서 뒤에서부터 확인하기로 했다.
그렇게 되면 가장 비쌀 때를 먼저 확인하고 이후에 주식을 살 수 있다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
//입력
int testcase;
cin >> testcase;
for (int i = 0; i < testcase; i++) {
int day; cin >> day;
vector<int>money(day);
for (int j = 0; j < day; j++) cin >> money[j];
//문제 해결 => 뒤에서부터 탐색 하자
//구입 시점 이후에서 가장 비쌀 때를 미리 확인하고 삼
//손해보게 파는것 보단 아예 안 사는게 나을 때도 있다
long long result = 0; //int로 선언하면 틀린다.
int k = day - 1;
for (int j = day-2; j >= 0; j--) {
if (money[k] > money[j]) result += money[k] - money[j]; //이익 계산
else k = j; // 이 경우에 money[k]가 가리키는 값이 더 커진다. (max값 찾는 과정)
}
//결과 출력
cout << result << '\n';
}
}
문제 코드 설명
1) 문제 해결
for문 안의 if 조건을 확인해보자.
money[k] > money[j] 라는 뜻은, 주어진 날들 중 오른쪽 끝에 가까운 날의 주가가 더 높다는 것이다.
그렇다면 j 날에 주식을 사서 k날에 팔아버리는 것이 이득이라는 소리이다.
또한 j날의 가격이 더 낮기 때문에 뒷부분에서 주가가 가장 비쌀 때는 여전히 k날이다.
위 조건을 만족하지 못하고 else문으로 넘어가게 되면, 최댓값이 바뀌었다는 소리이다.
따라서 최대값이 존재하는 날을 나타내는 변수인 k를 j 날로 바꾸어야 한다.
(max 값을 가지는 날을 갱신하는 것)
반응형
'알고리즘 > 코테 문제' 카테고리의 다른 글
[BOJ/백준 14713][C++] 앵무새 (0) | 2022.03.14 |
---|---|
[BOJ/백준 19941][C++] 햄버거 분배 (0) | 2022.03.11 |
[BOJ/백준 13413][C++] 오셀로 재배치 (0) | 2022.03.09 |
[BOJ/백준 9237][C++] 이장님 초대 (0) | 2022.03.08 |
[BOJ/백준 1946][C++] 신입 사원 (0) | 2022.03.07 |
Comments