일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- javascript
- 보안뉴스 요약
- 카카오프로젝트 100
- php
- ES6
- 자바스크립트 객체
- 파이썬
- 자바스크립트
- 보안뉴스 한줄요약
- Oracle SQL
- 자바스크립트 node
- 카카오프로젝트100
- 보안뉴스요약
- 보안뉴스한줄요약
- oracle
- 자바스크립트 API
- 자바스크립트 element api
- 자바스크립트 prototype
- 깃허브
- python
- 다크웹
- 자바스크립트 기본 문법
- 오라클
- GIT
- 보안뉴스
- oracle db
- 카카오프로젝트
- 랜섬웨어
- numpy
- 자바스크립트 jQuery
- Today
- Total
FU11M00N
[LeetCode] Minimum Size Subarray Sum - Javascript 본문
Minimum Size Subarray Sum
[최소길이의 subarray 구하기]
제약 조건
1 <= target <= 10^9
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^4
Example
ex1) Input: target = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: The subarray [4,3] has the minimal length under the problem constraint.
ex2) Input: target = 4, nums = [1,4,4]
Output: 1
ex3) Input: target = 11, nums = [1,1,1,1,1,1,1,1]
Output: 0
초기 문제 접근 방식
brute force 방법으로 i와 j를 돌려, i와 j가 더 한 값이 taget보다 크거나 같은지 반복문을 순회한다.
그 과정에서 cnt 변수에 해당 배열의 크기를 담아 두고 cnt의 최솟값을 minimum size로 판단하는 방법을 선택했다.
초기 전체코드
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function (target, nums) {
let sum = 0;
let cnt = 0;
let cntArr = [];
for (let i = 0; i < nums.length; i++) {
sum = 0;
cnt = 0;
for (let j = i; j < nums.length; j++) {
sum += nums[j];
cnt++;
if (sum >= target) {
cntArr.push(cnt);
}
}
}
if (cntArr.length) {
return Math.min(...cntArr);
}
return 0;
};
해당 코드로 주어진 아래의 testcase 3개를 모두 통과하여 제출을 했다.
ex1) Input: target = 7, nums = [2,3,1,2,4,3]
Output: 2
ex2) Input: target = 4, nums = [1,4,4]
Output: 1
ex3) Input: target = 11, nums = [1,1,1,1,1,1,1,1]
Output: 0
다시 생각 해보며..
하지만 전체의 21개의 testcase 중 18개밖에 통과를 하지 못했고, 타임아웃에 걸려 문제를 풀지 못했다.
아마 이중 for문을 사용 해 시간 복잡도가 O(n^2)가 되어 타임아웃에 걸린듯 했다.
brute force 방법을 사용하지않고, slice window기법으로 풀어야겠다 생각했다.
solve 전체 코드
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function (target, nums) {
let sum = 0;
let min = nums.length + 1;
let right = 0;
let left = 0;
let size = 0;
while (right < nums.length) {
sum += nums[right];
while (sum >= target) {
size = right - left + 1;
min = Math.min(min, size);
sum -= nums[left];
left++;
}
right++;
}
if (min > nums.length) {
return 0;
} else {
return min;
}
};
sum 변수에 nums 배열의 인덱스를 하나하나 더한 값이 target보다 크거나 같을 때까지 반복문을 수행한다.
더 큰 값이 들어왔다면 nums 배열의 맨 왼쪽 인덱스를 하나씩 제거하고 mininum size를 min 변수에 저장한다.
즉 2,3,1,2를 더한 값은 8이고 sum -= nums[left]를 통해 3,1,2 또한 target보다 큰 값이 될 수 있는지 비교한다.
될 수 없다면 맨 왼쪽 인덱스를 sum 값에서 제거하고 그다음 오른쪽 인덱스를 추가 하여 더 한다. ([3, 1, 2, 4]를 더 함)
이 과정을 반복 해 가장 작은 min 값을 가질 때 까지 반복한다.
min의 값이 nums.length보다 크다 면 배열에 있는 값을 모두 더해도 target 수 보다 클 수 없다는 의미기에 0을 리턴한다.
'알고리즘' 카테고리의 다른 글
[LeetCode] Linked List Cycle - Javascript (0) | 2023.08.28 |
---|---|
[LeetCode] Longest Substring Without Repeating Characters - Javascript (0) | 2023.08.28 |
[LeetCode] Two Sum II - Input Array Is Sorted - Javascript (0) | 2023.08.27 |
[LeetCode] Valid Palindrome - Javascript (0) | 2023.08.27 |
[LeetCode] Jump Game - Javascript (0) | 2023.08.25 |