๐Ÿ’ซ ETC/Leetcode

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

ming412 2023. 8. 24. 20:36

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

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

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/

 

Best Time to Buy and Sell Stock II - LeetCode

Can you solve this real interview question? Best Time to Buy and Sell Stock II - You are given an integer array prices where prices[i] is the price of a given stock on the ith day. On each day, you may decide to buy and/or sell the stock. You can only hold

leetcode.com

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

 

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

์ด์ „ Best Time to Buy and Sell Stock ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•˜์—ฌ ํ•ด๋‹น ํ’€์ด๋ฅผ ๋– ์˜ฌ๋ ธ๋‹ค.

๋‹ค๋ฅธ ์ ์€ ์ด์ „ ๋ฌธ์ œ๋Š” ํ•œ ๋ฒˆ๋งŒ ์‚ฌ๊ณ  ํŒ” ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ง€๊ธˆ์€ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ๊ณ  ํŒ” ์ˆ˜ ์žˆ์–ด ์ด์ต์˜ ์ด ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋”ฐ๋ผ์„œ 0๋ณด๋‹ค ํฐ ์ด์ต์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ์ด์ต์„ ๋ˆ„์ ํ•ด์•ผ ํ•˜๊ณ , ์—ฌ๋Ÿฌ๋ฒˆ ๋งค์ˆ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งค์ˆ˜์•ก์„ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค.

 

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

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

 

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

๋งค์ˆ˜์•ก = 10000 (ํฐ ๊ฐ’)
์ตœ์ข… ์ด์ต = 0
์˜ค๋Š˜ ํŒ”์•˜์„ ๋•Œ ์ด์ต = 0

for (0๋ถ€ํ„ฐ, ๋งˆ์ง€๋ง‰๊นŒ์ง€, 1์”ฉ ์ฆ๊ฐ€) {
	if (prices[i]๊ฐ€ ๋งค์ˆ˜์•ก๋ณด๋‹ค ์ž‘๋‹ค๋ฉด) {
    	๋งค์ˆ˜์•ก์„ prices[i]๋กœ ๊ฐฑ์‹ 
    }
    ์˜ค๋Š˜ ํŒ”์•˜์„ ๋•Œ ์ด์ต ๊ณ„์‚ฐ (prices[i] - ๋งค์ˆ˜์•ก)
    if (์ด์ต ๋ฐœ์ƒํ•œ๋‹ค๋ฉด) {
    	์ตœ์ข… ์ด์ต += ์˜ค๋Š˜ ํŒ”์•˜์„ ๋•Œ ์ด์ต
        ๋งค์ˆ˜์•ก์„ ๋งค๋„์•ก์œผ๋กœ ๊ฐฑ์‹ 
    }
}

 

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

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

        for (int i=0; i<prices.length; i++) {
            if (mn > prices[i]) {
                mn = prices[i];
            }
            pist = prices[i] - mn;
            if (pist > 0) { // ์˜ค๋Š˜ ํŒ”์•˜์„ ๋•Œ ์ด์ต์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด
                ans += pist; // ์ด์ต ๋ˆ„์ 
                mn = prices[i]; // โœ… ๋งค์ˆ˜์•ก์„ ๋งค๋„์•ก์œผ๋กœ ์ดˆ๊ธฐํ™”
            }
        }
        return ans;

    }
}

 

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

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

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

 

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

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

 

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

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

 

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

ํžˆ๋“  ์ผ€์ด์Šค๊นŒ์ง€ ํ†ต๊ณผํ•  ์ˆ˜๋Š” ์žˆ์—ˆ์ง€๋งŒ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€๋Š” ์•Š์€ ์ฝ”๋“œ์ด๋‹ค.

๋‚˜์ค‘์— ๋‹ค์‹œ ๋ณด์•˜์„ ๋•Œ ์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ๋‚˜์™”๋Š”์ง€ ๊ณฐ๊ณฐํžˆ ์ƒ๊ฐํ•ด ๋ณด์•„์•ผ ํ•  ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์„ฑ๋Šฅ์€ ๋‚˜์˜์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ณด์•˜์„ ๋•Œ์—๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋” ์ง๊ด€์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์ข‹์„ ๋“ฏ ํ•˜๋‹ค.

 

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

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

๋‚ด ์ฝ”๋“œ๋ณด๋‹ค ์ง๊ด€์ ์ธ ์ฝ”๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

class Solution {
    public int maxProfit(int[] prices) {
        ArrayList<Integer> priceGain = new ArrayList<Integer>();
        
        for(int i=0 ; i<prices.length-1; i++){
            if(prices[i] < prices[i+1]){ // ์ฃผ์‹ ๊ฐ€๊ฒฉ์ด ์ฆ๊ฐ€ํ•œ๋‹ค๋ฉด
                priceGain.add(prices[i+1] - prices[i]); // ์ด์ต ์ถ”๊ฐ€
            }
        }
        return priceGain.stream().mapToInt(n->n).sum();
    }
}

 

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

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

 

๋А๋‚€ ์ 

๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ์ž์‹ ๋งŒ์˜ ๋…ผ๋ฆฌ๋ณด๋‹ค๋Š” ๋ชจ๋‘๊ฐ€ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ์‹ถ๋‹ค. ๋ฌผ๋ก  ์‹คํ–‰๋˜๋Š”๊ฒŒ ์šฐ์„ ์ด๊ธด ํ•˜๊ฒ ์ง€๋งŒ!