๋ฌธ์ ํ์
์ ์ ๋ฐฐ์ด 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 ์ ์ปค๋ฎค๋ํฐ๋ฅผ ๋ณด๋, ๊ฐํน ๋ฉด์ ๊ด์ด ๋ค๋ฅธ ๋ฐฉ์ ์ ๊ทผ์ ๋ฌผ์ด๋ณด๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๊ณ ํ๋ค.
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ๊ฐ์ง ์ ๊ทผ๋ฒ์ผ๋ก ํ์ด๋ณด๋ ์ต๊ด์ด ์ง๊ธ๊น์ง๋ ์์๋๋ฐ, ๊น๊ฒ ๊ณ ๋ฏผํด๋ณด๋ ์ต๊ด์ ๋ค์ฌ์ผ๊ฒ ๋ค.