๐Ÿ’ซ ETC/Leetcode

Week 1-1. [Array / String] 121. Best Time to Buy and Sell Stock

ming412 2023. 8. 24. 17:18

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

โœ๏ธ ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ ์ •๋ฆฌํ•˜๊ธฐ (=์ฒด๊ณ„ํ™”)

https://leetcode.com/problems/best-time-to-buy-and-sell-stock/?envType=study-plan-v2&envId=top-interview-150 

 

Best Time to Buy and Sell Stock - LeetCode

Can you solve this real interview question? Best Time to Buy and Sell Stock - You are given an array prices where prices[i] is the price of a given stock on the ith day. You want to maximize your profit by choosing a single day to buy one stock and choosin

leetcode.com

์ฃผ์–ด์ง„ ์ฃผ์‹ ๊ฐ€๊ฒฉ์„ ๋ณด๊ณ  ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด์ต(๋งค๋„๊ฐ€๊ฒฉ - ๋งค์ˆ˜๊ฐ€๊ฒฉ)์„ ๊ตฌํ•˜๋ผ. 
  • ์ž…๋ ฅ
    • prices | int arrray := ํ•ด๋‹น ๋‚ ์งœ์˜ ์ฃผ์‹ ๊ฐ€๊ฒฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด, | prices | ∈ [1, 10^5]
  • ์ถœ๋ ฅ
    • k | int := ์ตœ๋Œ€ ์ด์ต
  • ์กฐ๊ฑด
    • | prices[i] | ∈ [0, 10^4]

 

๐Ÿ”Ž ์–ด๋–ค ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ๋Š”๊ฐ€?

๋งจ ์ฒ˜์Œ์—๋Š” 2์ค‘ for๋ฌธ์„ ์ด์šฉํ•ด ํ•˜๋‚˜์”ฉ ๋งค์ˆ˜์ผ๋กœ ์žก๊ณ , ๋งค์ˆ˜์ผ ์ดํ›„๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ตœ๋Œ€ ์ด์ต์„ ๊ตฌํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ prices์˜ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ 100,000์œผ๋กœ ๋‹น์—ฐํ•˜๊ฒŒ๋„ Time Limit Exceeded๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

class Solution {
    public int maxProfit(int[] prices) {
        int ans = 0;
        for (int i=0; i<prices.length; i++) {
            for (int j=i+1; j<prices.length; j++) {
                if (prices[j] - prices[i] > ans) {
                    ans = prices[j] - prices[i];                
                }
            }
        }
        return ans;
    }
}

 

์ดํ›„ Two Pointer ๋ฐฉ์‹์„ ์ƒ๊ฐํ–ˆ๋‹ค.

์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ lp๋ฅผ ์ด์šฉํ•ด ์ˆœํšŒํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ rp๋ฅผ ์ด์šฉํ•ด ์ˆœํšŒํ•˜๋ฉด์„œ max ๊ฐ’๊ณผ min ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

์•„๋ž˜ ๊ตฌํ˜„ ์ฝ”๋“œ๊ฐ€ ๊ทธ๊ฒƒ์ธ๋ฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—๋Š” ์„ฑ๊ณตํ–ˆ์ง€๋งŒ ํžˆ๋“  ์ผ€์ด์Šค์—์„œ ์‹คํŒจํ–ˆ๋‹ค.

 

๐Ÿ™ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ: ์ž…๋ ฅ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ

prices์˜ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ 100,000์ด๋ฏ€๋กœ ๋ฐ˜๋ณต๋ฌธ์€ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ“ ์˜์‚ฌ ์ฝ”๋“œ

lp = 0
rp = ๋งจ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค

mn = ์™ผ์ชฝ๋ถ€ํ„ฐ ์ตœ์†Ÿ๊ฐ’ (๋งค์ˆ˜)
mx = ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ตœ๋Œ“๊ฐ’ (๋งค๋„)

while (lp <= rp) {
	prices[lp]๊ฐ€ ์ตœ์†Ÿ๊ฐ’์ด๋ผ๋ฉด ์ตœ์†Ÿ๊ฐ’ ๊ฐฑ์‹ 
    prices[rp]๊ฐ€ ์ตœ๋Œ“๊ฐ’์ด๋ผ๋ฉด ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
    lp++
    rp++
}

์ตœ์†Ÿ๊ฐ’์ด ์ตœ๋Œ“๊ฐ’๋ณด๋‹ค ํฌ๋‹ค๋ฉด 0 ๋ฐ˜ํ™˜ (์ด์ต์„ ์–ป์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ)
์•„๋‹ˆ๋ผ๋ฉด (rp-lp) ๋ฐ˜ํ™˜

 

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

์•„๋ž˜ ์ฝ”๋“œ๋Š” ํŒจ์Šคํ•˜์ง€ ๋ชปํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

lp++ ๊ณผ rp-- ์„ ํ•˜๋ฉด์„œ ๊ฒฐ๊ตญ ์ค‘์•™์œผ๋กœ ๋ชจ์ด๋Š”๋ฐ, ๋งค์ˆ˜์•ก๊ณผ ๋งค๋„์•ก์ด ์ขŒ์ธก ํ˜น์€ ์šฐ์ธก์— ๋ชจ์—ฌ์žˆ์„ ๋•Œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ๋‹ค.

class Solution {
    public int maxProfit(int[] prices) {
        int lp = 0;
        int rp = prices.length-1;

        int mx = -1; // ๋งค๋„์•ก
        int mn = 1000; // ๋งค์ˆ˜์•ก

        int ans = 0;
        while (lp <= rp) {
            if (prices[lp] < mn) {
                mn = prices[lp];
            }
            if (prices[rp] > mx) {
                mx = prices[rp];
            }
            lp++;
            rp--;
        }

        ans = mx - mn;
        if (ans <= 0) {
            ans = 0;
        }
        return ans;
    }
}

 

๋‚ด ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ ์ฝ”๋“œ๋ผ ์„ฑ๋Šฅ ์ธก์ •์ด ํฌ๊ฒŒ ์˜๋ฏธ๋Š” ์—†์ง€๋งŒ, while๋ฌธ์„ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.

 

โœ๏ธ ์„ฑ๋Šฅ ํšŒ๊ณ 

N์€ ์ตœ๋Œ€ 100,000์ด๋ฏ€๋กœ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์ด๋‹ค.

 

๋ณดํ†ต 1์ดˆ ์ œํ•œ์ด๋ผ๊ณ  ํ•  ๋•Œ, O(N)์€ ์•ฝ 1์–ต๊นŒ์ง€ O(N^2)์€ ์•ฝ 1๋งŒ๊นŒ์ง€ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ 2์ค‘ for๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ํ„ฐ์ง€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

๐Ÿ’ก ๋ฌด์—‡์„/์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋ฐ˜๋ณต๋ฌธ์„ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ตœ๋Œ€ ์ด์ต์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ•ด์•ผ ํ•œ๋‹ค.

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

prices๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋งค์ˆ˜์•ก(mn, ์ตœ์†Œ ๊ธˆ์•ก) ๊ฐฑ์‹  & ์ด์ต(pist, ๋งค๋„์•ก - ๋งค์ˆ˜์•ก)์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋Œ€ ์ด์ต์„ ๊ตฌํ•œ๋‹ค.

class Solution {
    public int maxProfit(int[] prices) {
        int mn = Integer.MAX_VALUE; // ๋งค์ˆ˜์•ก (์ตœ์†Œ ๊ธˆ์•ก)
        int pist = 0; // profit if sold today: ์˜ค๋Š˜ ํŒ”์•˜์„ ๋•Œ ์ด์ต
        int ans = 0; // ์ตœ์ข… ์ด์ต

        for (int i=0; i<prices.length; i++) {
            if (prices[i] < mn) {
                mn = prices[i]; // ๋งค์ˆ˜์•ก ๊ฐฑ์‹ 
            }

            // prices[i]๋ฅผ ๋งค๋„์•ก์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด์ต ๊ณ„์‚ฐ
            pist = prices[i] - mn;

            if (ans < pist) { // ์˜ค๋Š˜ ํŒ”์•˜์„ ๋•Œ ์ด์ต์ด ๋” ํฌ๋‹ค๋ฉด ์ตœ์ข… ์ด์ต ๊ฐฑ์‹ 
                ans = pist;
            }
        }
        return ans;
    }
}

 

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

๋‹จ์ผ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.

 

๋А๋‚€ ์ 

๋‹จ์ผ for๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ดˆ์ ์„ ๋งž์ถ”์–ด ๊ณ ๋ฏผํ•˜๋‹ค๋ณด๋‹ˆ ๊ณ„์†ํ•ด์„œ Two Pointer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋ฐ–์— ๋– ์˜ค๋ฅด์ง€ ์•Š์•˜๋‹ค.

์–ด๋””์„ ๊ฐ€ ํ’€์–ด๋ณธ ๋ฌธ์ œ ์œ ํ˜•์ด์—ˆ๋Š”๋ฐ ๋๊นŒ์ง€ ํ’€์ง€ ๋ชปํ•ด ์•„์‰ฌ์› ๋‹ค. ๊ธฐ์–ต์ด ํ๋ ค์งˆ ๋•Œ ์ฏค ๊ผญ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ’€์–ด๋ณผ ๋ฌธ์ œ์ด๋‹ค.