์ƒˆ์†Œ์‹

IN DEPTH CAKE/Supercoder

[์ฝ”๋”ฉ/LeetCode150-(8)] Best Time to Buy and Sell Stock II (122)

  • -
๋ฐ˜์‘ํ˜•

 

๋ณธ ๊ธ€์€ LeetCode Top Interview 150์— ์ •๋ฆฌ๋œ ๋ฌธ์ œ๋ฅผ ์š”์•ฝํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ํ’€์ด๋ฅผ ํฌํ•จํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณธ ํฌ์ŠคํŒ… ์‹œ๋ฆฌ์ฆˆ๋Š” 150 list์˜ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ์„œ ๊ฒŒ์žฌ๋ฉ๋‹ˆ๋‹ค. ํ’€์ด ์–ธ์–ด๋Š” python์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๋‚œ์ด๋„Medium

ํ‚ค์›Œ๋“œ: Array, Greedy

 

๋ฌธ์ œ

 

๋ฌธ์ œ ์›๋ฌธ: https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/description/?envType=study-plan-v2&envId=top-interview-150 

 

prices๋ผ๋Š” ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค๊ณ ํ•˜์ž. ์ด ๋ฐฐ์—ด์˜ i๋ฒˆ์งธ ์›์†Œ๋“ค์€ ์ฃผ์‹์˜ ๊ฐ€๊ฒฉ์„ ์˜๋ฏธํ•œ๋‹ค. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ฃผ์‹๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ์ฃผ์‹์„ ํŒ”์ž๋งˆ์ž ๋‹น์ผ์— ๋ฐ”๋กœ ์‚ด ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์กฐ๊ฑด ํ•˜์—์„œ ์ตœ๋Œ€ ์ˆ˜์ต(profit)์„ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•˜๋ผ.

 

์˜ˆ์ œ ์ž…๋ ฅ

Input: prices = [7,1,5,3,6,4]
Output: 7
Explanation: Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4.
Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3.
Total profit is 4 + 3 = 7.
Input: prices = [1,2,3,4,5]
Output: 4
Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
Total profit is 4.
Input: prices = [7,6,4,3,1]
Output: 0
Explanation: There is no way to make a positive profit, so we never buy the stock to achieve the maximum profit of 0.

 

ํ’€์ด

 

์ฒ˜์Œ์—๋Š” Dynamic Programming์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€๊นŒ ์ƒ๊ฐํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ํ˜„์žฌ ์–ด๋–ค ์ฃผ์‹์„ ์‚ด์ง€ ๋ง์ง€๊ฐ€ ์ „์ฒด profit์˜ ์ตœ๋Œ“๊ฐ’์˜ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด '์ฃผ์‹์„ ํŒ”๊ณ  ๋‹น์ผ์— ์‚ด ์ˆ˜ ์žˆ๋‹ค'๋Š” ์กฐ๊ฑด๋•Œ๋ฌธ์— Greedy๋กœ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ตœ๋Œ€ํ•œ ์ ์€ ๊ฐ’์œผ๋กœ ๋งค์ž…ํ•ด์„œ ์ตœ๋Œ€ํ•œ์˜ ๊ธˆ์•ก์— ๋งค๋„ํ•˜๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚˜์˜ ๋งค๋„ ๊ฒฐ์ •์ด ์ „์—ญ์ ์ธ ์ตœ๋Œ“๊ฐ’์˜ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ฝ”๋“œ๋Š” ์•ž์„   121๋ฒˆ ๋ฌธ์ œ์˜ ์ฝ”๋“œ๋ฅผ ์•ฝ๊ฐ„๋งŒ ์ˆ˜์ •ํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

class Solution:
    def maxProfit(self, prices: List[int]) -> int:

        min_val = max_val = prices[0]
        ans = 0
        for price in prices:
            if price > max_val:
                max_val = price
            else:
                ans += max_val - min_val
                max_val = min_val = price
        
        return ans + max_val - min_val

 

 

Takeaway

์ฒ˜์Œ์— DP๋กœ ํ’€๋ ค๊ณ ํ–ˆ๋Š”๋ฐ state variable์„ ๋‘๊ฐœ๋กœ ๊ฐ€์ ธ๊ฐ€๋ฉด์„œ search space๊ฐ€ ์ปค์ง€๊ณ  pruning์— ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ๋‹ค์‹œ ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ–ˆ๋‹ค. ์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•  ๋•Œ ์กฐ๊ฑด๊ณผ ์ดํ•ด๋ฅผ ์ •ํ™•ํžˆ ํ•˜๋Š” ๊ฒŒ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠนํžˆ Greedy๋ฅผ ์“ธ๋•Œ๋Š” local optimal์ด global optimal์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๊ผญ ํ™•์ธํ•˜์ž.

 

 

 
๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

# ๋กœ๋”ฉ ํ™”๋ฉด ๋™์ž‘ ์ฝ”๋“œ(Code) ์„ค์ •ํ•˜๊ธฐ