Skip to content

LeetCode 121 - Best Time to Buy and Sell Stock โ€‹

๋ฌธ์ œ ์„ค๋ช… โ€‹

์ฃผ์–ด์ง„ prices ๋ฐฐ์—ด์—์„œ, i๋ฒˆ์งธ ๋‚ ์— ์ฃผ์‹์„ ์‚ฌ๊ณ  j๋ฒˆ์งธ ๋‚ ์— ํŒ๋‹ค๊ณ  ํ•  ๋•Œ (i < j), ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด์ต์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ฃผ์‹์€ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ๊ณ  ํ•œ ๋ฒˆ๋งŒ ํŒŒ๋Š” ๊ฒƒ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ ‘๊ทผ ๋ฐฉ๋ฒ• - Greedy (๊ทธ๋ฆฌ๋””) ๋ฐฉ์‹ โ€‹

์ด ๋ฌธ์ œ๋ฅผ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•ž์—์„œ๋ถ€ํ„ฐ ์ตœ์†Œ ๊ฐ€๊ฒฉ์„ ์ €์žฅํ•˜๋ฉด์„œ ํ˜„์žฌ ๊ฐ€๊ฒฉ๊ณผ์˜ ์ฐจ์ด๋กœ ์ตœ๋Œ€ ์ด์ต์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์•„์ด๋””์–ด โ€‹

  • ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉด์„œ ์ตœ์†Œ ๊ฐ€๊ฒฉ(minPrice) ์„ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๊ฐ€๊ฒฉ์—์„œ ์ตœ์†Œ ๊ฐ€๊ฒฉ์„ ๋บ€ ๊ฐ’์„ ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋Œ€ ์ด์ต(maxProfit) ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณผ๊ฑฐ ๊ฐ€๊ฒฉ๋งŒ ๋ณด๊ณ , ๋ฏธ๋ž˜ ๊ฐ€๊ฒฉ์— ํŒ”๊ธฐ ์œ„ํ•ด ์•ž์—์„œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ โ€‹

typescript
function maxProfit(prices: number[]): number {
  let minPrice = Number.MAX_SAFE_INTEGER
  let maxProfit = 0

  for (let price of prices) {
    if (price < minPrice) {
      minPrice = price
    } else {
      maxProfit = Math.max(maxProfit, price - minPrice)
    }
  }

  return maxProfit
}

์‹œ๊ฐ„ ๋ฐ ๊ณต๊ฐ„ ๋ณต์žก๋„ โ€‹

๊ตฌ๋ถ„๋ณต์žก๋„
์‹œ๊ฐ„ ๋ณต์žก๋„O(n)
๊ณต๊ฐ„ ๋ณต์žก๋„O(1)
  • ํ•œ ๋ฒˆ์˜ for๋ฌธ์œผ๋กœ ์ „์ฒด ๋ฐฐ์—ด์„ ์ˆœํšŒ โ†’ O(n)
  • ์ถ”๊ฐ€ ๋ฐฐ์—ด์ด๋‚˜ ์ž๋ฃŒ๊ตฌ์กฐ ์—†์ด ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ โ†’ O(1)

์ฃผ์š” ํฌ์ธํŠธ โ€‹

  • ์•ž์—์„œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜์—ฌ ์ตœ์†Œ ๊ฐ€๊ฒฉ์„ ์ฐพ๊ณ , ํ˜„์žฌ ๊ฐ€๊ฒฉ๊ณผ์˜ ์ฐจ์ด๋กœ ์ตœ๋Œ€ ์ด์ต ๊ณ„์‚ฐ
  • ์‹œ๊ฐ„ ํšจ์œจ์„ฑ๊ณผ ๊ณต๊ฐ„ ํšจ์œจ์„ฑ์ด ๋ชจ๋‘ ์ตœ์ 
  • ์ธํ„ฐ๋ทฐ์—์„œ๋„ ์ž์ฃผ ์ถœ์ œ๋˜๋Š” ์ „ํ˜•์ ์ธ ์ตœ์ ํ™” ๋ฌธ์ œ ํŒจํ„ด

์˜ˆ์‹œ โ€‹

bash
Input: prices = [7,1,5,3,6,4]
Output: 5

์„ค๋ช…:
- ์ตœ์†Œ ๊ฐ€๊ฒฉ = 1 (2๋ฒˆ์งธ ๋‚ )
- ์ตœ๋Œ€ ์ด์ต = 6 - 1 = 5 (5๋ฒˆ์งธ ๋‚ ์— ํŒ”์•˜์„ ๋•Œ)