개요

‘투 포인터’는 이름 그대로 2개의 포인터1를 사용해 배열, 리스트, 문자열 같은 자료구조를 보다 효율적으로 탐색하는 기법이다.

예시

대표적인 문제로 정렬된 배열에서 합이 특정값 S가 되는 두 원소쌍이 존재하는지 구하는 문제가 있다.

단순하게 생각하면 이중 반복문을 통해 모든 가능한 합을 구하고, 그 합이 S인지 확인하는 방법이 있다. 이 경우의 시간복잡도는 이 된다.

투 포인터를 사용하면 만에 해결할 수 있다.

각각의 포인터를 배열의 양쪽 끝을 가리키도록 한다. (각각 left, right라고 지칭) 그리고 각 포인터가 가리키는 원소의 합이 S보다 크다면 right 포인터를 left쪽으로 옮기고, 작다면 leftright으로 옮긴다.

public boolean twoSum(int[] arr, int target) {
	int left = 0;
	int right = arr.length - 1;
	
	while (left < right) {
		int sum = arr[left] + arr[right];
		
		if (sum == target)
			return true;
			
		if (sum < target)
			left++;
			
		if (sum > target)
			right--;
	}
	
	return false;
}

각각의 포인터를 한 쪽 방향으로만 이동시키기 때문에, 방문했던 원소는 다시 방문하지 않는다. 그래서 전체 시간복잡도가 이 된다.

참고자료

Footnotes

  1. 메모리의 주소를 저장하는 포인터가 아니라, 말 그대로 ‘가리킨다’는 의미에서 사용.