문제 링크: https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/
주어진 조건
문제
정말 이리저리 고민을 해보다가, 사실 최대 수익을 얻는 건, 다음 날 가격이 올라간다면, 그 날 매수하고, 다음 날 바로바로 파는 방식이지 않을까 생각이 들어서 아래와 같이 구현했다.
class Solution:
def maxProfit(self, prices: List[int]) -> int:
profit = 0
for i in range(1, len(prices)):
if prices[i] > prices[i - 1]:
profit += prices[i] - prices[i - 1]
return profit
Time: O(N)
for문 하나만 반복하고 있으니, 시간복잡도는 O(N)
Space: O(1)
따로 메모리 공간을 사용하고 있지 않으니, 공간복잡도는 O(1)
위 사진을 보면 그때그때의 저점과 고점에 매수, 매도를 하는 것이 좋다는 것을 알 수 있다.
전역 관점에서봤을 땐, valley2가 최저점, peak5가 최고점이지만 A+B ≥ C 가 성립하는 걸 볼 수 있다.
이 사진도 마찬가지로, valley3가 최저점, peak6이 최고점이지만, 바로 사고 바로 파는 방식을 따랐을 때와 수익이 같다는 것을 알 수 있다.
(A+B+C = D)
class Solution:
def maxProfit(self, P: List[int]) -> int:
return sum(P[i]-P[i-1] if P[i] > P[i-1] else 0 for i in range(1, len(P)))
내가 작성했던 코드를 위처럼 짧게 줄일 수 있었다.
아무래도 이 문제의 집중해야 될 포인트는 주식을 산 당일에 다시 살 수 있다는 점이었다.