Best Time to Buy and Sell Stock
이 문제는 헷갈릴 수 있지만, “전체 배열에서 가장 싼 날”과 “전체 배열에서 가장 비싼 날” 을 찾으면 안된다.
먼저 구매를 진행한 다음, 판매를 진행하는데, 위와 같이 찾을 경우 가장 싼 날이 가장 비싼 날보다 다음에 있을 경우, 바로 구할 수 없게 되기 때문이다.
따라서, 다음과 같이 생각해야 한다.
"
각 시점에서 과거 최저가를 기억하면서현재가와 비교"하는 문제
그리고, 각 시점에서 과거 기준 가장 저렴했던 최솟값과 현재 값을 비교한다는 점에서 DP 를 떠올릴 수 있다.
전날까지의 최대 이익 vs 현재 가 - 최저가를 뺀 최대 이익 을 비교한다.class Solution {
public int maxProfit(int[] prices) {
// 1. 각 날짜까지 고려했을 때, 최대 이익을 담을 배열 지정
int[] dp = new int[prices.length];
// 2. 최저가 정의
int min = prices[0];
// 최고가 정의
int max = 0;
// 3. 과거의 최저가와 현재 가격을 비교
for(int i = 1; i < prices.length; i ++) {
min = Math.min(min, prices[i]);
// i번째 전날까지의 값과 현재 가격에서 최저가를 뺀 이익을 비교
dp[i] = Math.max(dp[i - 1], prices[i] - min);
}
// 4. dp 배열의 마지막엔 최대 이익이 담겨있으므로, 반환
return dp[prices.length - 1];
}
}