말 그대로 두 개의 포인터를 사용하는 알고리즘. 여기서 포인터는 C/C++의 포인터가 아니라, 어느 위치를 가르키는 개념적인 포인터다.
Collision - One array, move from two sides to middle.
Forward - One array, both move forward.
Parallel - Two arrays, each array has been assigned with a pointer
arr[R]값을 sum에 더한다.
M(목표값)과 sum을 비교한다.
2-1) 같은 경우, ans++
2-2) sum이 M보다 작은 경우, R++
2-3) sum이 M보다 큰 경우, sum -= arr[ L ], L++ 후 2.로 돌아간다.
1.로 돌아가 반복한다.
function answer2(){ //연속하는 수 합 3 let arr = [1,2,3,4,2,5,3,1,1,2]; //let arr = [1,2,1,3,1,1,1,2]; let n = arr.length; let lt = 0; let find = 3; // 6 let sum = 0; let count =0; for(let rt = 0;rt<n;rt++){ sum += arr[rt]; if (sum === find) count++; while(sum >= find){ sum -= arr[lt++]; if(sum === find) count++; } } console.log(count); }
function answer(){ let N=5, M=5; let arr = [1,3,1,2,3]; let memorize = Array.from({length:N} , ()=>[]); //추가공부 let sum = 0; let lt = 0; let answer = 0; for(let rt=0;rt<N;rt++){ sum += arr[rt]; memorize[rt].push(arr[rt]); if(sum <= M) { //let value = []; // for(let j=lt;j<=rt;j++){ // value.push(arr[j]); // } memorize[rt].push(value); answer += rt-lt+1; } while(sum > M){ sum -= arr[lt++]; if(sum <= M) { // let value = []; // for(let j=lt;j<=rt;j++){ // value.push(arr[j]); // } // memorize[rt].push(value); answer += rt-lt+1; } } } console.log(answer , memorize); }