
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
โ๏ธ ๋๋ง์ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ์ ๋ฆฌํ๊ธฐ (=์ฒด๊ณํ)
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๋ "์ฐ์์ ์ธ" ๋ฐฐ์ด์ ์๋ฏธํ๋๋ฐ, ์ฐ์์ ์ด์ง ์์ ๋ถ๋ถ ๋ฐฐ์ด๋ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์๋ชป ์ดํดํ๋ค.
๋ฌธ์ ๋ฅผ ์ ํํ ์ดํดํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํจ์ ๋ค์ ํ๋ฒ ๊นจ๋ฌ์๋ค.
'๐ซ ETC > Leetcode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Week 1-2. [Linked List] 141. Linked List Cycle (Python3) (0) | 2023.08.28 |
|---|---|
| ๐ก Week 1-2. [Sliding Window] 3. Longest Substring Without Repeating Characters (Python3) (0) | 2023.08.28 |
| Week 1-2. [Two Pointers] 167. Two Sum II - Input Array Is Sorted (Java) (0) | 2023.08.28 |
| Week 1-2. [Two Pointers] 125. Valid Palindrome (Java) (0) | 2023.08.26 |
| Week 1-1. [Array / String] 55. Jump Game (0) | 2023.08.24 |