์ƒˆ์†Œ์‹

IN DEPTH CAKE/Supercoder

[์ฝ”๋”ฉ/LeetCode150-(7)] Best Time to Buy and Sell Stock (121)

  • -
๋ฐ˜์‘ํ˜•

 

 

 

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

 

 

 

๋‚œ์ด๋„: EASY

ํ‚ค์›Œ๋“œ: Array

 

 

๋ฌธ์ œ

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

 

prices๋ผ๋Š” ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค๊ณ ํ•˜์ž. ์ด ๋ฐฐ์—ด์˜ i๋ฒˆ์งธ ์›์†Œ๋“ค์€ ์ฃผ์‹์˜ ๊ฐ€๊ฒฉ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ๋•Œ ์—ฌ๋Ÿฌ๋ถ„์€ ์ฃผ์‹์„ ์‚ฌ๋Š” ๋‚ ๊ณผ ํŒŒ๋Š” ๋‚ ์„ ์ •ํ•˜๋ ค๊ณ ํ•œ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฑฐ๋ž˜ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ค‘ ์ตœ๋Œ€ ์ด์œค ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ผ. (๋„ˆ๋ฌด ๋‹น์—ฐํ•˜๊ฒŒ๋„ ๋งค๋„๋Š” ๋งค์ž… ์ดํ›„์— ์ด๋ฃจ์–ด์ ธ์•ผํ•œ๋‹ค.) ์ด์œค์„ ๋‚ผ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 0์„ ๋ฐ˜ํ™˜ํ•ด๋ผ.

 

ํ’€์ด 

(Runtime: beats 99.83% of users with Python 3, Memory: beats 19.17 % of users with Python 3)

 

ํ’€์ด ์œ ๋„ ์‚ฌ๊ณ ์˜ ํ๋ฆ„

max ๊ฐ’๊ณผ min ๊ฐ’์„ ๊ฐ๊ฐ O(N)์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ด ๋‘ ๊ฐ’์ด min ๊ฐ’์ด ์•ž์—์žˆ๊ณ  max ๊ฐ’์ด ๋’ค์— ์žˆ๋‹ค๋ฉด ์ด ๋‘˜์˜ ์ฐจ๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์„๊ฑฐ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๋ณด์žฅ๋„ ๋˜์ง€ ์•Š์„ ๋ฟ๋”๋Ÿฌ max์™€ min์€ ๊ฐ๊ฐ O(N)์ด๋‹ˆ๊นŒ  (O(2N)์ด๋‹ˆ๊นŒ ์‹ค์ œ ์ˆ˜ํ–‰์‹œ๊ฐ„์—์„œ ์†ํ•ด) ์ด ๋‘˜์„ ํ•œ๋ฒˆ์— ์ฐพ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

๋‘ ๊ฐœ์˜ ๊ฐ’์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ „์ฒด ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜์ž. i๋ฒˆ์งธ ๊ฐ’์ด min_val๋ณด๋‹ค ์ž‘์œผ๋ฉด min_val์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  i๋ฒˆ์งธ ๊ฐ’์ด max_val๋ณด๋‹ค ํฌ๋ฉด max_val์„ ์—…๋ฐ์ดํŠธํ•˜์ž. max_val์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋Š” max_val์„ ๋ณ„๋„๋กœ ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ min_val์„ ์—…๋ฐ์ดํŠธํ• ๋•Œ๋Š” max_val๋„ ์—†๋˜์ผ๋กœ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” max_val๊ณผ min_val์˜ ์ฐจ๋ฅผ ans๊ฐ’์— ์—…๋ฐ์ดํŠธ ํ•œ ํ›„ max_val์„ ํ˜„์žฌ์˜ min_val๋กœ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๋Š” ํ˜•ํƒœ๋กœ ์ „์ฒด ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜์ž.

 

ํ’€์ด ๊ตฌํ˜„

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

        min_val = max_val = prices[0]
        ans = 0

        for price in prices:
            if price < min_val:
                ans = max(ans, max_val - min_val)
                max_val = min_val = price
            elif price > max_val:
                max_val = price
        
        return max(ans, max_val - min_val)

 

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N), ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(1)

 

 

Takeaway

 

๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ๋ฒ• ์ค‘์˜ ํ•˜๋‚˜๋กœ, ์ด ๋ฌธ์ œ๋Š” DP ๋ฌธ์ œ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๊ทผ๋ฐ ๋ฌธ์ œ ํŠน์„ฑ๋งŒ์„ ๋ถ„์„ํ•ด์„œ ํ’€์–ด์„œ ๋‹ค๋ฅธ overhead ์—†์ด ๋” ๋น ๋ฅธ ์ˆ˜ํ–‰์‹œ๊ฐ„์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ“š LeetCode 75 / Code Signal ํ’€์ด ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

๋ฐ˜์‘ํ˜•
Contents

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

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

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