PLOD

[Algorithm] 투포인터(Two pointers) 본문

computer science/Algorithm | Datastructure

[Algorithm] 투포인터(Two pointers)

훌룽이 2024. 7. 18. 16:51

리스트에 순차적으로 접근해야 할 때 두개의 점의 위치를 기혹하면서 처리하는 알고리즘이다. 정렬되어 있는 두 리스트의 합집합에도 사용됨, 병합정렬(merge sort)의 counquer(정복)영역의 기초가 되기도 한다.

예제 문제 - 특정한 합을 가지는 부분 연속 수열 찾기

투포인터 알고리즘의 대표적인 문제입니다.

어떤 숫자들의 리스트가 주어질 때, 해당 리스트의 연속 수열의 합이 특정 값을 가지는 것을 확인하는 문제입니다.

  1. 시작점과 끝점이 첫번째 원소의 인덱스를 가리키도록 한다.(start, end = 0,0)
  2. 현재 부분 합이 M과 같다면 카운트한다. (if sum[start:end] == M)
  3. 현재 부분 합이 M보다 작다면 end를 1 증가시킨다. (end += 1)
  4. 현재 부분 합이 M보다 크거나 같다면 start를 1 증가시킨다.(start += 1)
  5. 모든 경우를 확인할 때까지 2-4번 과정을 반복한다.

그림과 함께 설명하기

위와 같은 리스트와 𝑀=5 일 때의 예시를 생각해봅시다.

  • [초기 단계] : 시작점과 끝점이 첫번째 원소의 인덱스를 가리키도록 합니다.
    • 현재의 부분 합은 1.
    • 현재 카운트 : 0
  • [Step 1] : 이전 단계에서의 부분합이 1 -> end를 증가시킵니다.
    • 현재의 부분 합 : 3
    • 현재 카운트 : 0
  • [Step 2] : 부분합이 3 -> end를 증가시킵니다.
    • 현재의 부분 합 : 6
    • 현재 카운트 : 0
  • [Step 3] : 부분합 6 -> start를 1 증가시킵니다.
    • 현재의 부분 합 : 5
    • 현재 카운트 : 1 (부분합이 5이기 때문에)
  • 이걸 계속 반복하다가 마지막
  • [마지막]
    • 현재의 부분합 : 5

시간복잡도

매 루프마다 항상 두 포인터 중 하나는 1씩 증가하고 각 포인터가 n번 누적 증가해야 알고리즘이 끝납니다.

(백준 2003, 2018을 참고하세요~)

 

 

https://www.acmicpc.net/problem/2018

 

 

https://www.acmicpc.net/problem/2003

 

 

 

 

Comments