알고리즘에서 "투 포인터"는 주어진 배열 또는 리스트에서 두 개의 포인터를 사용하여 특정 조건을 만족시키는 요소를 탐색하거나 연산을 수행하는 방법을 말합니다.
투 포인터 알고리즘은 일반적으로 선형 시간(O(n))에 해결할 수 있는 문제에 사용됩니다.
투 포인터 알고리즘은 다양한 문제에 적용될 수 있지만, 대표적인 두 가지 유형으로 나눌 수 있습니다.
예시
1. 두 수의 합 (Two Sum)
정렬된 배열에서 두 수의 합이 특정한 값을 만족하는 요소의 인덱스를 찾는 문제입니다. 다음은 투 포인터 알고리즘을 사용한 예시 코드입니다
publicint[] twoSum(int[] numbers,int target){int left =0; // 배열의 시작 지점을 가리키는 왼쪽 포인터int right =numbers.length-1; // 배열의 끝 지점을 가리키는 오른쪽 포인터 while (left < right) { // 왼쪽 포인터가 오른쪽 포인터를 넘어가지 않는 동안 반복int sum = numbers[left] + numbers[right]; // 현재 왼쪽과 오른쪽 포인터가 가리키는 두 수의 합if (sum == target) {returnnewint[]{left, right}; // 합이 목표값과 일치하면 해당 인덱스를 반환 } elseif (sum < target) { left++; // 합이 목표값보다 작으면 왼쪽 포인터를 오른쪽으로 이동 } else { right--; // 합이 목표값보다 크면 오른쪽 포인터를 왼쪽으로 이동 } }returnnewint[]{-1,-1}; // 합을 찾지 못한 경우 -1을 반환}
이 코드는 주어진 정렬된 배열에서 두 수를 선택하여 그 합이 주어진 목표값과 일치하는 경우, 해당 인덱스를 반환합니다. 만약 그러한 인덱스를 찾을 수 없으면 {-1, -1}을 반환합니다.
2. 두 수의 차이 (Two Difference)
정렬된 배열에서 두 수의 차이가 특정한 값을 만족하는 요소의 개수를 찾는 문제입니다. 다음은 투 포인터 알고리즘을 사용한 예시 코드입니다
publicinttwoDifference(int[] numbers,int target) {int count =0; // 차이가 목표값과 일치하는 경우의 개수를 저장하는 변수int left =0; // 배열에서 왼쪽을 가리키는 포인터int right =1; // 배열에서 오른쪽을 가리키는 포인터while (right <numbers.length) { // 배열의 끝까지 반복int diff = numbers[right] - numbers[left]; // 현재 왼쪽과 오른쪽 포인터가 가리키는 두 수의 차이if (diff == target) { count++; // 차이가 목표값과 일치하는 경우 개수를 증가 left++; // 다음 요소를 비교하기 위해 왼쪽 포인터를 오른쪽으로 이동 right++; // 다음 요소를 비교하기 위해 오른쪽 포인터를 오른쪽으로 이동 } elseif (diff < target) { right++; // 차이가 목표값보다 작으면 오른쪽 포인터를 오른쪽으로 이동 } else { left++; // 차이가 목표값보다 크면 왼쪽 포인터를 오른쪽으로 이동if (left == right) { right++; // 왼쪽 포인터와 오른쪽 포인터가 같은 경우 오른쪽 포인터도 이동 } } }return count; // 차이를 만족하는 요소의 개수 반환}
이 코드는 주어진 배열에서 두 수의 차이가 주어진 목표값과 일치하는 경우의 개수를 반환합니다. 왼쪽 포인터와 오른쪽 포인터를 사용하여 배열을 탐색하고, 차이가 목표값과 일치하면 개수를 증가시키고 포인터를 이동합니다.
이와 같이 투 포인터 알고리즘은 효율적으로 정렬된 배열 또는 리스트에서 원하는 조건을 만족하는 요소를 탐색하거나 연산을 수행할 수 있습니다. 투 포인터 알고리즘은 선형 시간에 문제를 해결할 수 있는 장점이 있으며, 정렬된 데이터에서 효과적으로 동작합니다.