[Algorithm] 투포인터(Two Pointer) 알고리즘
글 작성자: _rian
알고리즘 문제를 풀다보면 종종 나오는 투포인터 알고리즘! 막 꼬여가지고 ㅋㅋㅋ 저도 중간에 제대로 못짜고 그러는 경우가 많은데요, 많은 코딩테스트 문제에 등장하는 것은 아니지만 잊을만하면 종종 등장하는 투포인터 알고리즘에 대해 알아봅시다!
투포인터 (Two Pointers)
- 리스트에 순차적으로 접근해야 할 때 두 개의 점의 위치를 기록하면서 처리하는 알고리즘
- 정렬되어있는 두 리스트의 합집합에도 사용됨. 병합정렬(merge sort)의 counquer 영역의 기초가 되기도 합니다.
예제 문제 - 특정한 합을 가지는 부분 연속 수열 찾기
투포인터 알고리즘의 대표적인 문제입니다.
어떤 숫자들의 리스트가 주어질 때, 해당 리스트의 연속 수열의 합이 특정 값을 가지는 것을 확인하는 문제입니다.
- 시작점과 끝점이 첫번째 원소의 인덱스를 가리키도록 한다.
- 현재 부분 합이 M과 같다면 카운트한다.
- 현재 부분 합이 M보다 작다면 end를 1 증가시킨다.
- 현재 부분 합이 M보다 크거나 같다면 start를 1 증가시킨다.
- 모든 경우를 확인할 때까지 2-4번 과정을 반복한다.
그림과 함께 설명하기
위와 같은 리스트와 $M=5$ 일 때의 예시를 생각해봅시다.
- [초기 단계] : 시작점과 끝점이 첫번째 원소의 인덱스를 가리키도록 합니다.
- 현재의 부분 합은 1.
- 현재 카운트 : 0
- [Step 1] : 이전 단계에서의 부분합이 1 -> end를 증가시킵니다.
- 현재의 부분 합 : 3
- 현재 카운트 : 0
- [Step 2] : 부분합이 3 -> end를 증가시킵니다.
- 현재의 부분 합 : 6
- 현재 카운트 : 0
- [Step 3] : 부분합 6 -> start를 1 증가시킵니다.
- 현재의 부분 합 : 5
- 현재 카운트 : 1 (부분합이 5이기 때문에)
- 이걸 계속 반복하다가 마지막
- [마지막]
- 현재의 부분합 : 5
코드
n = 5 # 데이터의 개수 N
m = 5 # 찾고자하는 부분합 M
count = 0
interval_sum = 0
end = 0
# start를 차례대로 증가시키며 반복
for start in range(n):
# end만큼 이동시키기
while interval_sum < m and end < n:
interval_sum += data[end]
end += 1
# 부분합이 m일 때 카운트 증가
if interval_sum == m:
count += 1
interval_sum -= data[start]
print(count)
시간복잡도
$$ O(N) $$
매 루프마다 항상 두 포인터 중 하나는 1씩 증가하고 각 포인터가 n번 누적 증가해야 알고리즘이 끝납니다. -> 각각 배열 끝에 다다르는데 $O(N)$ 이라 둘을 합해도 여전히 $O(N)$입니다.
c.f> 슬라이딩 윈도우
투포인터처럼 구간을 훑으면서 지나간다는 공통점이 있으나 슬라이딩 윈도우는 어느 순간에도 구간의 넓이가 동일하다는 차이점이 있습니다. 거의 비슷한 느낌인 것 같긴 하지만요 ^ㅇ^;;
Reference
'알고리즘 Algorithm ' 카테고리의 다른 글
[Algorithm] DFS와 BFS 기본 개념 및 관련 문제들 (python) (0) | 2021.04.23 |
---|---|
[Algorithm] 트라이(Trie)와 관련 문제들 (Python) (0) | 2021.04.11 |
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 73장~75장 (0) | 2020.07.08 |
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 72장 (0) | 2020.07.05 |
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 70장 ~ (0) | 2020.07.03 |
댓글
이 글 공유하기
다른 글
-
[Algorithm] DFS와 BFS 기본 개념 및 관련 문제들 (python)
[Algorithm] DFS와 BFS 기본 개념 및 관련 문제들 (python)
2021.04.23 -
[Algorithm] 트라이(Trie)와 관련 문제들 (Python)
[Algorithm] 트라이(Trie)와 관련 문제들 (Python)
2021.04.11 -
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 73장~75장
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 73장~75장
2020.07.08 -
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 72장
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 72장
2020.07.05