
배열에서 두 개의 포인터(인덱스)를 동시에 움직이며 조건을 만족하는 구간이나 쌍을 찾는 알고리즘
left, 끝 포인터 right를 초기화right--left++ 등대부분 배열로 만들어진 자료구조를 기반으로 구현됨
| 자료구조 | 설명 | 활용 예 |
|---|---|---|
| 배열 | 탐색 대상 기본 구조 | 정렬된 배열의 합, 부분합 |
| 정렬된 배열 | 값 비교 최적화 | 투포인터 전제 조건 |
| 슬라이딩 윈도우 배열 | 일정 범위의 값 추적 | 연속된 수열 탐색 |
| 문자열 배열 | 문자열 비교 문제 | 아나그램, 회문 쌍 |
const twoSum = (nums, target) => {
nums.sort((a, b) => a - b); // 정렬 필수
let left = 0, right = nums.length - 1;
while (left < right) {
const sum = nums[left] + nums[right];
if (sum === target) return [nums[left], nums[right]];
else if (sum < target) left++;
else right--;
}
return []; // 조건 만족하는 쌍 없음
};
// 슬아이딩 윈도우와 투 포인터가 결합된 형태
const minSubArrayLen = (target, nums) => {
let left = 0, sum = 0, minLen = Infinity;
for (let right = 0; right < nums.length; right++) {
sum += nums[right];
while (sum >= target) {
minLen = Math.min(minLen, right - left + 1);
sum -= nums[left++];
}
}
return minLen === Infinity ? 0 : minLen;
};
| 문제 | 키워드 | 상태 표현식 | 포인터 이동 / 조건 로직 |
|---|---|---|---|
| Two Sum II | 정렬된 배열에서 쌍 찾기 | left, right | sum < target → left++, sum > target → right-- |
| Minimum Size Subarray Sum | 연속된 수열 / 최소 길이 | left, right, sum | sum ≥ target → left++, sum < target → right++ |
| 3Sum | 세 수의 조합 | i, left, right | sum === 0 → 정답 저장, 나머진 위와 동일 |
| 회문 판단 | 양끝 비교 | start, end | s[start] !== s[end] → false, 점점 좁힘 |
| 교집합 / 차집합 | 두 배열 비교 | i, j (두 배열 포인터) | arr1[i] === arr2[j] → 저장, 작으면 해당 포인터 증가 |