CS기초/코딩테스트

LeetCode 122 (Easy) Best Time to Buy and Sell Stock II

오늘의 나1 2021. 3. 3. 20:37
출처: leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/
 

Best Time to Buy and Sell Stock II - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문제

한글 번역은 아래 더보기를 클릭해주세요. 

더보기

배열 prices의 i번째 엘리먼트의 값은 day i의 주가를 의미한다.

이 때, 얻을 수 있는 최고 수익을 구하여라. 원하는 대로 트랜잭션을 진행 수 있다. (예, 주식 1주를 매수하여 1주를 매도하는 과정을 여러 번 수행할 수 있다)

주의: 여러 개의 트랜잭션을 동시에 수행할 수는 없다. 매수 전에는 매도하여 보유한 주식이 없어야 한다.

 

예제 1:

  • 입력: prices = [7, 1, 5, 3, 6, 4]
  • 출력: 7
  • 설명: 1일(가격 = 1)에 사고 3일(가격=5)에 판다, 수익 = 5 - 1 = 4.
    그리고나서 4일(가격 = 3)에 사고 5일(가격=6)에 판다, 수익 = 6 - 3 = 3

예제 2:

  • 입력: prices = [1, 2, 3, 4, 5]
  • 출력: 4
  • 설명: 1일(가격 = 1)에 사고 5일(가격=5)에 판다, 수익 = 5 - 1 = 4.
    1일에 사고, 2일에 사고 나중에 팔 수 없다. 동시에 여러 개의 트랜잭션을 같게 되기 때문이다. 다시 사기 전에 반드시 팔아야 한다.

예제 2:

  • 입력: prices = [7, 6, 4, 3, 1]
  • 출력: 0
  • 설명: 이 경우, 매수매도는 이루어지지 않았다. 예, 최대 수익 = 0

제약조건:

  • 1 <= prices.length <= 3 * 10^4
  • 0 <= prices[i] <= 10^4 

풀이

해결방법

주식을 안 갖고 있을 때, 오늘 가격이 내일 가격보다 싸면 매수

주식을 갖고 있을 때, 오늘이 마지막 날이거나, 오늘 가격이 내일 가격보다 비싸면 매도

 

javascript

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let hasStock = false;
    let myStock = 0;
    let benefit = 0;
    for(let i = 0, len = prices.length; i < len; i += 1) {
        if (!hasStock && prices[i] < prices[i + 1]) {
            // 주식을 안 갖고 있을 때, 오늘 가격이 내일 가격보다 싸면 매수
            hasStock = true;
            myStock = prices[i];
        } else if (hasStock && (i === len - 1 || prices[i] > prices[i + 1])) {
            // 주식을 갖고 있을 때, 오늘이 마지막 날이거나, 오늘 가격이 내일 가격보다 비싸면 매도
            benefit += (prices[i] - myStock);
            hasStock = false;
        }
    }
    
    return benefit;
};

python

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        hasStock = False
        myStock = 0
        benefit = 0
        priceLen = len(prices)
        
        for i in range(priceLen):
            if hasStock is False and i < priceLen - 1 and (prices[i] < prices[i + 1]):
                hasStock = True
                myStock = prices[i]
            elif hasStock is True and (i == priceLen - 1 or prices[i] > prices[i + 1]):
                benefit += (prices[i] - myStock)
                hasStock = False
                print(prices[i], myStock, benefit)
            
        return benefit

결과