알고리즘Medium#182
투 포인터 기법은 어떤 문제에 적합한가요?
#알고리즘#TwoPointers#배열#복잡도
답변 포인트
두 인덱스 이동 규칙를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
투 포인터는 두 인덱스를 이동하며 탐색 범위를 줄이는 기법입니다. 정렬 배열의 합 찾기, 중복 제거, 양끝 비교 문제에서 O(n)으로 개선할 수 있습니다.
투 포인터는 두 개의 인덱스나 포인터를 움직이며 탐색 범위를 효율적으로 줄이는 기법입니다. 보통 정렬된 배열, 양끝에서 좁혀가는 문제, 연속 구간 문제에서 중첩 반복문을 O(n) 또는 O(n log n) 수준으로 줄일 때 사용합니다.
핵심 개념
- 양끝 포인터는 정렬 배열에서 합, 차이, 조건 만족 쌍을 찾을 때 유용합니다.
- 같은 방향 포인터는 윈도우나 부분 배열을 유지하며 이동할 때 쓰입니다.
- 포인터를 어떻게 움직일지 결정할 수 있는 정렬성/단조성이 필요합니다.
동작 방식 또는 판단 기준
이 주제를 이해할 때는 다음 순서로 보면 실무 적용이 쉬워집니다.
- 무엇을 해결하려는가: 성능, 표현력, 안정성, 접근성 중 어떤 문제를 줄이려는지 확인합니다.
- 전제 조건은 무엇인가: 정렬 여부, 브라우저 지원, 네트워크 특성, 동시성 조건처럼 성립해야 하는 조건을 점검합니다.
- 비용은 어디서 발생하는가: 시간 복잡도, 메모리, 캐시, 재시도, 렌더링 비용처럼 병목 지점을 나눠 봅니다.
- 실패 시 어떤 문제가 생기는가: 잘못 적용했을 때의 버그나 운영 리스크를 함께 고려합니다.
실제 예시
JavaScript
// 정렬된 배열에서 두 수의 합이 target인지 확인
function twoSumSorted(arr, target) {
let left = 0, right = arr.length - 1;
while (left < right) {
const sum = arr[left] + arr[right];
if (sum === target) return true;
if (sum < target) left++;
else right--;
}
return false;
}실무에서 주의할 점
- 정렬이 필요한 문제에서 정렬 전 원래 인덱스를 잃어버릴 수 있습니다.
- 음수/양수가 섞인 연속 구간 합 문제는 단순 투 포인터가 성립하지 않을 수 있습니다.
- 중복 값을 처리할 때 포인터 이동과 결과 카운팅을 신중히 해야 합니다.
실무 적용 가이드
- O(n²) 모든 쌍 탐색이 보이면 정렬 + 투 포인터 가능성을 먼저 검토합니다.
- 포인터 이동의 근거를 '왜 이쪽은 버려도 되는가'로 설명할 수 있어야 합니다.
- 연속 구간 문제는 슬라이딩 윈도우와 구분하되, 둘은 같은 방향 투 포인터의 변형으로 볼 수 있습니다.
함께 연결해서 보면 좋은 키워드
Two Pointers, Sorted Array, Pair Search, Algorithm
정리
투 포인터는 두 개의 인덱스나 포인터를 움직이며 탐색 범위를 효율적으로 줄이는 기법입니다. 다만 개념 자체보다 중요한 것은 적용 조건과 한계를 함께 이해하는 것입니다. 작은 예제에서는 단순해 보여도 실제 서비스에서는 성능, 보안, 유지보수성, 접근성 요구사항이 함께 얽히므로, 문제의 성격을 먼저 파악한 뒤 적절한 도구로 선택하는 것이 좋습니다.