투포인터 알고리즘은 배열이나 리스트와 같은 자료구조에서 두 개의 포인터를 사용하여 특정한 조건을 만족하는 구간이나 요소들을 효율적으로 탐색하는 방법이다. 이 알고리즘은 주로 정렬된 배열에서 많이 사용되며, 특정한 합을 찾거나, 구간의 길이를 조절하면서 문제를 해결할 때 유용하다.
투포인터 알고리즘의 핵심은 두 개의 포인터를 사용하여 배열을 탐색하는 것이다. 이 투포인터는 일반적으로 시작과 끝 또는 두 위치를 가리키며, 각각의 포인터를 조작하여 문제를 해결한다.
두 포인터를 초기화한다. 하나는 배열의 시작 또는 특정 위치에, 다른 하나는 배열의 끝 또는 특정 위치에 놓는다.
두 포인터가 가리키는 요소를 기반으로 특정 조건을 검사한다.
조건을 만족하거나 불만족할 때 포인터를 이동하여 조건을 만족하도록 시도한다.
포인터가 배열의 경계를 벗어나거나 조건을 만족할 때까지 2와 3을 반복한다.
정렬된 배열 lst와 목표 값 target이 주어졌을 때, 두 수의 합이 target이 되는 배열의 두 요소가 존재하는지 찾으시오.
lst = [1, 2, 3, 4, 5]
target = 7
left = 0
right = len(lst) - 1
while left < right:
current_sum = lst[left] + lst[right]
if current_sum == target:
break
elif current_sum < target:
left += 1
elif current_sum > target:
right += 1
print(lst[left], lst[right])
배열 lst와 목표 값 target이 주어졌을 때, 부분 배열의 합이 target이 되는 경우가 있는지 찾으시오.
lst = [1, 2, 3, 4, 5]
target = 9
start = 0
end = 0
current_sum = 0
while end < len(lst):
if current_sum < target:
current_sum += lst[end]
end += 1
elif current_sum > target:
current_sum -= lst[start]
start += 1
elif current_sum == target:
break
print(lst[start:end])
두 포인터를 사용하여 한 번의 순회로 문제를 해결할 수 있어 시간 복잡도를 줄일 수 있다. 참고로 투 포인터 시간 복잡도는 O(n)이다.
코드가 비교적 간단하고 직관적이다.