์šฐ๊ทœ์ด์ธ์šฐ์œค
Eager To Learn ๐ŸŒŒ
์šฐ๊ทœ์ด์ธ์šฐ์œค
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿก ํ™ˆ
  • ๐Ÿš€ ๊นƒํ—ˆ๋ธŒ
  • โ›… ํƒœ๊ทธ ํด๋ผ์šฐ๋“œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (217)
    • ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm ๊ธฐ๋ฒ• (1)
      • ๋ฐ”ํ‚น๋… (21)
    • ๋ธ”๋กœ๊ทธ ์ด์‚ฌ (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • ์ž๋ฃŒ๊ตฌ์กฐ (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • ๊ฐœ๋ฐœ์„œ์  (15)
      • ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ธฐ์ดˆ (1)
      • ์˜ค๋ธŒ์ ํŠธ - ์กฐ์˜ํ˜ธ (7)
      • ์นœ์ ˆํ•œ SQL ํŠœ๋‹ (7)
    • ํšŒ๊ณ  (2)
hELLO ยท Designed By ์ •์ƒ์šฐ.
์šฐ๊ทœ์ด์ธ์šฐ์œค
๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป PS/LeetCode 150

[Java] 209. Minimum Size Subarray Sum

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป PS/LeetCode 150

[Java] 209. Minimum Size Subarray Sum

2023. 8. 26. 21:41

๋ฌธ์ œ ํŒŒ์•…

 

์ •์ˆ˜ ๋ฐฐ์—ด nums ์™€ ์–‘์ˆ˜ target ์ด ์ฃผ์–ด์ง„๋‹ค

 

๋ถ€๋ถ„ ์ง‘ํ•ฉ์˜ ํ•ฉ์ด target ๊ณผ ๋™์ผํ•˜๊ฑฐ๋‚˜ ์ด์ƒ ๊ฐ’์„ ๊ฐ–๋Š” ์ตœ์†Œ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.

 

์—†๋‹ค๋ฉด, 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 


ํ’€์ด

1๏ธโƒฃ ํˆฌ ํฌ์ธํ„ฐ ํ’€์ด

๐Ÿ’ก ๋– ์˜ค๋ฅธ Idea

ํˆฌํฌ์ธํ„ฐ ๋ฐฉ์‹์œผ๋กœ ๋ถ€๋ถ„ํ•ฉ์„ ๊ตฌํ•˜๋‹ค๊ฐ€, target๊ณผ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๊ทธ ์ด์ƒ ๊ฐ’์ด ๋˜๋ฉด ๊ธฐ๋กํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ์™ผ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ์˜ฎ๊ธด ๋’ค์— ๋‹ค์‹œ ํƒ์ƒ‰์„ ํ•œ๋‹ค.

 

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int ans = Integer.MAX_VALUE;
        int left = 0, right = 0;
        int sum = 0;
        while (right <= nums.length) {
            if (sum < target) {
                if (right == nums.length) {
                    break;
                }
                sum += nums[right++];
            } else {
                ans = Math.min(ans, right - left);
                sum -= nums[left++];
            }
        }
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}

 

์˜๋„ํ•œ ๋Œ€๋กœ, ๋ถ€๋ถ„ํ•ฉ์ด target ์ด์ƒ์ด๋ฉด left ํฌ์ธํ„ฐ๋ฅผ ์ด๋™ํ•ด์„œ ๋‹ค์‹œ whlie ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ฒŒ๋” ํ•˜์˜€๋‹ค.

 

๋งŒ์•ฝ right๊ฐ€ ๋ฐฐ์—ด ๋์— ๋„๋‹ฌํ–ˆ๋Š”๋ฐ๋„, target ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋” ๋”ํ•  ์ˆ˜๊ฐ€ ์—†์œผ๋ฅด๋ชจ while ๋ฌธ์„ ๊ทธ๋งŒ ์‹คํ–‰ํ•ด๋„ ๋œ๋‹ค.

 

๊ฒฐ๊ณผ

 

 

2๏ธโƒฃ ์ด๋ถ„ํƒ์ƒ‰ ํ’€์ด

O(NlogN) ํ’€์ด ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•ด๋ณด๋ผ๊ณ  ํ•˜๊ธธ๋ž˜ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค.

 

๋ณดํ†ต, O(NlogN) ์€ ์ด๋ถ„ ํƒ์ƒ‰์ด๋ฏ€๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋ถ„ํƒ์ƒ‰ ํ’€์ด๋ฅผ ๋– ์˜ฌ๋ ค๋ณด์•˜๋‹ค.

 

์ด๋ถ„ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด์žˆ์–ด์•ผ ํ•˜๊ณ ,

 

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

 

๊ตฌ๊ฐ„ ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๋ฐฐ์—ด [ 16, -5, -11, -15, 10, 5, 4, -4 ] ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ,

 

๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด์„ ๊ตฌํ•˜๋ฉด

 

[ 16, 11, 0, -15, -5, 0, 4, 0 ] ์ด ๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด index๊ฐ€ 1๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ 5๋ฒˆ์งธ ์›์†Œ๊นŒ์ง€์˜ ๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด

 

arr[1] + arr[2] + arr[3] + arr[4] + arr[5] = (-5) + (-11) + (-15) + 10 + 5 = -16์ด๋‹ค.

 

๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌ๊ฐ„ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•˜๋ฉด sum[5] - sum[0] = -16์œผ๋กœ ๋‹จ ํ•œ๋ฒˆ์˜ ์—ฐ์‚ฐ์œผ๋กœ ๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก ์ •๋ฆฌํ•˜๋ฉด, ๋ฐฐ์—ด a ~ b ๊นŒ์ง€์˜ ๊ตฌ๊ฐ„ํ•ฉ์„ ๊ตฌํ•  ๋•Œ, ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด์˜ sum[b] - sum[a-1] ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ตฌ๊ฐ„ ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ด๋ถ„ํƒ์ƒ‰์„ ํ’€์ด์— ์ ์šฉ

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋– ์˜ฌ๋ฆฐ ๋ฐฉ์‹์€, ๊ตฌ๊ฐ„ํ•ฉ ๋ฐฐ์—ด์„ ๊ตฌํ•˜๊ณ  

 

a~b ๊นŒ์ง€์˜ ํ•ฉ์„ ๊ตฌํ•  ๋•Œ,

 

for๋ฌธ์„ ์ˆœํšŒํ•˜๋ฉด์„œ a๋ฅผ ๊ณ ์ •์‹œํ‚ค๊ณ  b-a๊ฐ€ target ์ด์ƒ์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด 

 

๊ตฌ๊ฐ„ํ•ฉ์ด target์ด์ƒ์ด ๋˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ , ๊ทธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ–ˆ์„ ๋•Œ ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค.

 

class Solution {
        public int minSubArrayLen(int target, int[] nums) {
        int[] sum = new int[nums.length + 1];
        int ans = Integer.MAX_VALUE;

        // ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
        for (int i = 1; i < sum.length; i++) {
            sum[i] = nums[i - 1] + sum[i - 1];
        }

        // a~b ์˜ ํ•ฉ์ด target ๋ณด๋‹ค ํฐ ๋ถ€๋ถ„ ๊ตฌํ•˜๊ธฐ
        for (int i = 0; i < sum.length - 1; i++) {
            // fixed ๋Š” sum[a]์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’ 
            int fixed = sum[i];

            // sum[b]-sum[a] = ๊ตฌ๊ฐ„ํ•ฉ >= target ์ด ๋˜๋Š” ๋ถ€๋ถ„ ์ฐพ๊ธฐ
            int find = target + fixed;

            // ์ด๋ถ„ํƒ์ƒ‰
            int left = i + 1, right = sum.length - 1;
            while (left < right) {
                int mid = (left + right) / 2;
                if (find <= sum[mid]) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }

            if (sum[left] >= find) {
                ans = Math.min(ans, left - i);
            }

        }
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}

 

์ด๋ถ„ํƒ์ƒ‰์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€, ์‚ฌ๋žŒ๋งˆ๋‹ค ์•ฝ๊ฐ„์”ฉ ๋‹ค๋ฅด๋‹ˆ

 

๋‚ด๊ฐ€ ์ œ์‹œํ•œ ๋…ผ๋ฆฌ์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด๋ถ„ํƒ์ƒ‰์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ฒฐ๊ณผ

 

 

3๏ธโƒฃ Arrays.binarySearch() ํ™œ์šฉ

 

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ์ด๋ถ„ํƒ์ƒ‰ ๋ฉ”์„œ๋“œ์ธ, Arrays.binarySearch() ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ’€์–ด๋ณด์•˜๋‹ค.

 

์ฐธ๊ณ ๋กœ, ํ•ด๋‹น key๋ฅผ ์ฐพ์œผ๋ฉด ๊ทธ ์œ„์น˜๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด -Insertion point-1 ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

insertion point : ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ–ˆ์„ ๋•Œ, ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜

 

import java.util.*;
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int[] sum = new int[nums.length + 1];
        int ans = Integer.MAX_VALUE;

        // ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
        for (int i = 1; i < sum.length; i++) {
            sum[i] = nums[i - 1] + sum[i - 1];
        }
        // a~b ์˜ ํ•ฉ์ด target ๋ณด๋‹ค ํฐ ๋ถ€๋ถ„ ๊ตฌํ•˜๊ธฐ
        for (int i = 0; i < sum.length - 1; i++) {
            // fixed ๋Š” sum[a]์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’ 
            int fixed = sum[i];

            // sum[b]-sum[a] = ๊ตฌ๊ฐ„ํ•ฉ >= target ์ด ๋˜๋Š” ๋ถ€๋ถ„ ์ฐพ๊ธฐ
            int find = target + fixed;

            int result = Arrays.binarySearch(sum, find);

            if (result > 0 && result > i) {
                ans = Math.min(ans, result - i);
            } else {
                int idx = -result - 1;
                if (idx < sum.length) {
                    ans = Math.min(ans, idx - i);
                }
            }

        }
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}

 

๊ฒฐ๊ณผ


๐Ÿ“– ํšŒ๊ณ 

 

์™œ ํšจ์œจ์ ์ธ O(N) ํ’€์ด๋ฅผ ๋ƒ…๋‘๊ณ  O(NlogN) ํ’€์ด๋ฅผ ์š”๊ตฌํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๊ธด ํ–ˆ๋‹ค.

 

LeetCode ์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋ณด๋‹ˆ, ๊ฐ„ํ˜น ๋ฉด์ ‘๊ด€์ด ๋‹ค๋ฅธ ๋ฐฉ์‹ ์ ‘๊ทผ์„ ๋ฌผ์–ด๋ณด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ ‘๊ทผ๋ฒ•์œผ๋กœ ํ’€์–ด๋ณด๋Š” ์Šต๊ด€์ด ์ง€๊ธˆ๊นŒ์ง€๋Š” ์—†์—ˆ๋Š”๋ฐ, ๊นŠ๊ฒŒ ๊ณ ๋ฏผํ•ด๋ณด๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ์•ผ๊ฒ ๋‹ค.

 

  • ๋ฌธ์ œ ํŒŒ์•…
  • ํ’€์ด
  • 1๏ธโƒฃ ํˆฌ ํฌ์ธํ„ฐ ํ’€์ด
  • ๊ฒฐ๊ณผ
  • 2๏ธโƒฃ ์ด๋ถ„ํƒ์ƒ‰ ํ’€์ด
  • ๊ฒฐ๊ณผ
  • 3๏ธโƒฃ Arrays.binarySearch() ํ™œ์šฉ
  • ๊ฒฐ๊ณผ
  • ๐Ÿ“– ํšŒ๊ณ 
'๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป PS/LeetCode 150' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Java] 141. Linked List Cycle
  • [Java] 3. Longest Substring Without Repeating Characters
  • [Java] 167. Two Sum II - Input Array Is Sorted
  • [Java] 125. Valid Palindrome
์šฐ๊ทœ์ด์ธ์šฐ์œค
์šฐ๊ทœ์ด์ธ์šฐ์œค
๊ฐœ๋ฐœ์ž ๊ฟˆ๋‚˜๋ฌด

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.