๐Ÿ’ซ ETC/Leetcode

Week 1-2. [Sliding Window] 209. Minimum Size Subarray Sum (Java)

ming412 2023. 8. 28. 18:22

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

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

https://leetcode.com/problems/minimum-size-subarray-sum/?envType=study-plan-v2&envId=top-interview-150 

 

Minimum Size Subarray Sum - LeetCode

Can you solve this real interview question? Minimum Size Subarray Sum - Given an array of positive integers nums and a positive integer target, return the minimal length of a subarray whose sum is greater than or equal to target. If there is no such subarr

leetcode.com

์ฃผ์–ด์ง„ ๋ฐฐ์—ด๋กœ ์ด๋ฃจ์–ด์ง„ subarray ์˜ ์š”์†Œ ํ•ฉ์ด target ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ, subarray์˜ ์ตœ์†Œ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ.
  • ์ž…๋ ฅ
    • nums | int array := ์–‘์˜ ์ •์ˆ˜ ๋ฐฐ์—ด, | nums | ∈ [1, 10^5]
    • target | int := ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด target๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•œ๋‹ค, | target | ∈ [1, 10^9]
  • ์ถœ๋ ฅ
    • k | int := ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ์ตœ์†Œ ๊ธธ์ด
  • ์กฐ๊ฑด
    • | numbers[i] | ∈ [-1000, 1000]
    • subarray๋ž€ ์—ฐ์†์ ์ธ ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด๋‹ค.

 

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

์ฃผ๋จน๊ตฌ๊ตฌ์‹์œผ๋กœ subarray์˜ ๊ธธ์ด๋ฅผ 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋Š˜๋ ค๊ฐ€๋ฉฐ, ํ•ฉ์ด target ์ด์ƒ์ผ ๋•Œ ์ค‘๋‹จํ•˜๋ ค ์ƒ๊ฐํ–ˆ๋‹ค. 

subarray์˜ ๊ธธ์ด๋ฅผ i๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, ๊ฐ๊ฐ์˜ i์—์„œ ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด Sliding Window ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

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

numbers์˜ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ 100,000์ด๋ฏ€๋กœ O(N^2)์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ํ„ฐ์งˆ๊ฒƒ์ด๋‹ค..

์šฐ์„ ์€ ์ง๊ด€์ ์œผ๋กœ ์ƒ๊ฐ๋‚˜๋Š” ๋ฐฉ๋ฒ•์ธ, 2์ค‘ for๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋’ค ๋‹จ์ผ for๋ฌธ์œผ๋กœ ๊ฐœ์„ ํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค.

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

sum = 0
for (i=1๋ถ€ํ„ฐ, ๋ฐฐ์—ด๊ธธ์ด๊นŒ์ง€, 1์”ฉ ์ฆ๊ฐ€) {
	lp = 0
    rp = i
    
	for (j=0๋ถ€ํ„ฐ, rp๊นŒ์ง€, 1์”ฉ ์ฆ๊ฐ€) {
    	sum์— nums[j] ๋ˆ„์ 
    }
    
    while (rp๊ฐ€ nums.length๋ณด๋‹ค ์ž‘์€ ๋™์•ˆ) {
    	sum์— nums[rp] ๋”ํ•˜๊ธฐ
        sum์— nums[lp] ๋นผ๊ธฐ
        if (sum์ด target๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด) {
        	sum ๋ฐ˜ํ™˜
        }
        rp++
        lp++
    }
    sum์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
}

 

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

์—ญ์‹œ๋‚˜ Time Limit Exceeded๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0;

        for (int i=1; i<=nums.length; i++) { // i๋Š” subarray ๊ธธ์ด
            int lp = 0;
            int rp = lp + i;
            for (int j=lp; j<rp; j++) {
                sum += nums[j];
            }
            if (sum >= target) {
                return i; // ์ตœ์†Œ subarray ๊ธธ์ด ๋ฐ˜ํ™˜
            }
            // Sliding Window
            while (rp < nums.length) {
                sum -= nums[lp];
                sum += nums[rp];
                if (sum >= target) {
                    return i; // ์ตœ์†Œ subarray ๊ธธ์ด ๋ฐ˜ํ™˜
                }
                lp++;
                rp++;
            }
            sum = 0;
        }
        return 0;
    }
}

 

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

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

์™ธ๋ถ€ ๋ฃจํ”„์—์„œ i๋Š” 1๋ถ€ํ„ฐ nums.length๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์™ธ๋ถ€ ๋ฃจํ”„๋Š” O(N)๋ฒˆ ์ˆ˜ํ–‰๋œ๋‹ค.

๋‚ด๋ถ€ ๋ฃจํ”„์—์„œ lp์™€ rp๋Š” ๊ฐ๊ฐ ์ตœ๋Œ€ O(N)๋ฒˆ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์ฒด ์ฝ”๋“œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N^2)์ด๋‹ค.

 

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

๋ชจ๋“  subarray๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ ํšจ์œจ์ ์ด์ง€ ์•Š์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

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

30๋ถ„ ์ด์ƒ ๊ณ ๋ฏผํ•ด ๋ณด์•˜์œผ๋‚˜ ๋ชจ๋“  subarray๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ์‹ ์ด์™ธ์—๋Š” ๋„์ €ํžˆ ์ƒ๊ฐ๋‚˜์ง€ ์•Š์•„ ํ•ด๋‹ต์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.

 

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

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

์šฐ์„  rp๋ฅผ 0์œผ๋กœ ๋‘๊ณ , rp๋งŒ 1์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉฐ (lp๋Š” ๊ณ ์ •) 0๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ rp๋ฒˆ ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ํ•ฉ์ด target๋ณด๋‹ค ์ปค์ง€๋Š” ์‹œ์ ์„ ์ฐพ๋Š”๋‹ค.

0๋ถ€ํ„ฐ rp๊นŒ์ง€์˜ ํ•ฉ์ด sum๋ณด๋‹ค ํฌ๋‹ค๋ฉด, ์ด์ œ lp๋ฅผ ์›€์ง์ธ๋‹ค.

lp๋ฅผ 0๋ถ€ํ„ฐ 1์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉฐ sum์—์„œ nums[lp]๋ฅผ ๋บ€๋‹ค. ์ด๋•Œ, sum์ด target๋ณด๋‹ค ํฌ๋‹ค๋ฉด ans์˜ ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค. (rp-lp)

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0, lp = 0, rp = 0, ans = Integer.MAX_VALUE;
        while (rp < nums.length) {
            sum += nums[rp]; // โœ… ์˜ค๋ฅธ์ชฝ ์ฐฝ๋ฌธ์„ ๋Š˜๋ฆฌ๋ฉฐ sum์ด target๋ณด๋‹ค ์ปค์ง€๋Š” ์‹œ์ ์„ ์ฐพ๋Š”๋‹ค.
            rp++;
            while (sum >= target) {
                ans = Math.min(ans, rp-lp); // ์ค‘๊ฐ„์ค‘๊ฐ„ ์กฐ๊ฑด์ด ๋งŒ์กฑํ•  ๋•Œ๋งˆ๋‹ค, ํ•ด๋‹น ์‹œ์ ์˜ ์„œ๋ธŒ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ์ฒดํฌํ•˜๋ฉฐ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
                sum -= nums[lp]; // โœ… ์™ผ์ชฝ ์ฐฝ๋ฌธ์„ ๋‹ซ์œผ๋ฉฐ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.
                lp++;
            }
        }
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}

 

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

์™ธ๋ถ€ while๋ฌธ์€ O(N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

๋‚ด๋ถ€ while๋ฌธ์€ sum์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑ์‹œํ‚ฌ ๋•Œ์—๋งŒ ์‹คํ–‰๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ „์ฒด ์ฝ”๋“œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.

 

๋А๋‚€ ์ 

์ฒ˜์Œ์— subarray์˜ ์ •์˜๋ฅผ ์ฐฉ๊ฐํ•˜์—ฌ ๋” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

subarray๋Š” "์—ฐ์†์ ์ธ" ๋ฐฐ์—ด์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, ์—ฐ์†์ ์ด์ง€ ์•Š์€ ๋ถ€๋ถ„ ๋ฐฐ์—ด๋„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์ž˜๋ชป ์ดํ•ดํ–ˆ๋‹ค. 

๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•จ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊นจ๋‹ฌ์•˜๋‹ค.