다수의 값들 중 특별한 기준을 맞춘 두 개의 지점 혹은 값을 찾을 때 2개의 지점을 이용하는 것을 말한다.
예를들어, 아래와 같은 문제가 있다고 하자.
이 때, two pointer 테크닉을 이용하자면 다음과 같이 풀 수 있다.
그럼 two pointer 테크닉을 적용하면 다음과 같이 풀 수 있다.
정렬
Left pointer → 1, Right pointer → 16, 합이 17
17은 13보다 크므로, Right pointer를 왼쪽으로 옮긴다.
Left pointer → 1, Right pointer → 9, 합이 10
10은 13보다 작으므로, Left pointer를 오른쪽으로 옮긴다.
Left pointer → 3, Right pointer → 9, 합이 12
12는 13보다 작으므로, Left pointer를 오른쪽으로 옮긴다.
Left pointer → 4, Right pointer → 9, 합이 13
목표로 하는 값이 나왔으므로, 그 합이 13이 되는 2개의 숫자가 존재한다.
지금이야 그 2개의 값이 나왔으니 다행이지만, 나오지 않은 경우는 어찌할 것인가?
two pointer는 모든 조합을 조사하지는 않는 것 같은데, 그럼에도 불구하고 2개의 값이 나오지 않은 경우를 신뢰할 수 있는가? 다른 말로, two pointer 테크닉을 증명할 수 있나?
이 부분이 내가 정말 고민하던 부분이었다. 반례를 구하려고도 했었다.(two pointer 테크닉이 2개의 숫자를 찾을 수 없다고 말하지만, 실제로는 그런 조합이 존재하는 경우)
하지만 처참히 실패했다.
다행하게도, 다음 글을 통해 그 힌트를 발견할 수 있었다.
여기서 사용된 방법은 해당 테크닉이 해가 있음에도 없다고 말하는 경우가 없다는 것을 증명한 것이다.
동일한 방법으로 위의 two pointer 테크닉을 다음의 2가지로 증명할 수 있다.
Left가 Left 답에 도착하기 전에 Right가 Right 답 왼쪽으로 이동하는 경우가 없다는 것을 증명하면 된다.
Right가 Right 답에 도착하기 전에 Left가 Left 답 오른쪽으로 이동하는 경우가 없다는 것을 증명하면 된다.
첫번째 경우 증명
두번째 경우 증명