배열의 특정 연속된 구간을 처리하기 원하는 경우
1차원 배열에서 배열을 가리키고 있는
2개의 포인터를 조작하여, 원하는 값을 얻는 알고리즘
function solution() {
const arr = [1,3,2,2,5,7,2,6];
const M = 9;
let ans = 0;
let start = 0, end = 0, sum = arr[0];
while(arr[start] && arr[end]){
// M 과 같은 경우
if(sum === M){
ans++;
end++;
sum += arr[end];
}
// M보다 큰 경우
else if(sum > M){
sum -= arr[start];
start++;
}
// M보다 작은 경우
else{
end++;
sum += arr[end];
}
}
return ans;
}
- 먼저 포인터 2개를 잡는다.
(start, end)- 처음에
start와end는 모두0에서 시작한다.- 현재의
sum의 값과 우리가 찾는M값을 비교하여, start와 end의 포인터를 옮겨준다.- start, end는
arrindex에 존재하는 포인터 값이여야한다.
일정한 사이즈를 가지는 윈도우를 나타낸다. 처음과 끝 포인터가 함께 움직인다.
function maxSumArr(arr, size) {
let maxSum = 0;
let tempSum = 0;
if(arr.length < size) return null;
for(let i = 0; i < size; i++) {
tempSum += arr[i];
}
tempSum = maxSum;
for(let i = size; i < arr.length; i++) {
tempSum = tempSum - arr[i - size] + arr[i];
maxSum = Math.max(tempSum, maxSum);
}
return maxSum;
}
- 일시적인 합
(tempSum)그리고 가장 큰 합(maxSum), 두개의 변수를 활용- 마지막에는 두 값을 비교하여
maxSum을 반환한다.- 반복문을 통해
arr[0]부터 시작하여size의 숫자만큼까지의 배열 값의 총합을 구한다.- 두번째 반복문을 통해 범위를 이동시키면서 원래 있던 범위의
뒤에 있는 값을 더하고맨 앞에 있는 값을 뺀다.