TwoPointers
투포인터란?
배열이나 리스트에서 두 개의 포인터를 사용하여 문제를 해결하는 알고리즘
시간 복잡도: O(N)
공간 복잡도: O(1)
동작 방식
두 개의 포인터를 배열의 시작점이나 끝점에 위치
문제의 조건에 따라 포인터들을 이동
포인터들의 위치를 조정하며 원하는 조건을 만족하는 경우를 찾음
구현 예시
public class TwoPointers {
// 두 수의 합 구하기
public static int[] 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 new int[]{left, right};
} else if (sum < target) {
left++;
} else {
right--;
}
}
return new int[]{-1, -1}; // 합이 target인 두 수를 찾지 못한 경우
}
// 연속된 부분 수열의 합
public static int[] findSubarraySum(int[] arr, int target) {
int left = 0;
int right = 0;
int currentSum = 0;
while (right < arr.length) {
currentSum += arr[right];
while (currentSum > target && left < right) {
currentSum -= arr[left];
left++;
}
if (currentSum == target) {
return new int[]{left, right};
}
right++;
}
return new int[]{-1, -1}; // 합이 target인 부분 수열을 찾지 못한 경우
}
}
투포인터의 장점
선형 시간 복잡도 (O(N))
추가 메모리 사용이 적음
구현이 직관적
투포인터의 단점
정렬이 필요한 경우가 많음
특정 문제에만 적용 가능
활용 사례
두 수의 합 구하기
세 수의 합 구하기
연속된 부분 수열의 합
회문 검사
중복 제거
주의사항
포인터 이동 조건을 정확히 설정해야 함
배열의 경계 조건 처리 필요
정렬이 필요한 경우 정렬 시간 고려
Last updated