이 영역을 누르면 첫 페이지로 이동
butter_shower 블로그의 첫 페이지로 이동

butter_shower

페이지 맨 위로 올라가기

butter_shower

[Algorithm] 투포인터(Two Pointer) 알고리즘

  • 2021.04.28 23:19
  • 알고리즘 Algorithm
글 작성자: _rian

알고리즘 문제를 풀다보면 종종 나오는 투포인터 알고리즘! 막 꼬여가지고 ㅋㅋㅋ 저도 중간에 제대로 못짜고 그러는 경우가 많은데요, 많은 코딩테스트 문제에 등장하는 것은 아니지만 잊을만하면 종종 등장하는 투포인터 알고리즘에 대해 알아봅시다!

투포인터 (Two Pointers)

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

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

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

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

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

그림과 함께 설명하기

img

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

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

  • 라이님 블로그 - 투 포인터(Two Pointers Algorithm), 슬라이딩 윈도우(Sliding Window) (수정: 2019-09-09)

'알고리즘 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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [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
다른 글 더 둘러보기

정보

butter_shower 블로그의 첫 페이지로 이동

butter_shower

  • butter_shower의 첫 페이지로 이동

검색

메뉴

  • All Categories
  • About Me
  • Guest Book

카테고리

  • 전체보기 (223)
    • 💫 주인장 이야기 (17)
    • 🌱 와글와글뻘글 (27)
    • IT Trends (11)
    • 주인장 일상 (0)
    • 📒 내 마음대로 독서 서평 (12)
    • 머신러닝 꿈나무 (30)
      • 기본 개념 (6)
      • Hands-on! (5)
      • Paper Review (5)
      • 캐린이의 Kaggle (1)
    • 알고리즘 Algorithm (33)
      • PS (8)
    • Computer Engineering (75)
      • Python (8)
      • Cloud Computing (9)
      • C (9)
      • C++ (0)
      • Java (6)
      • Django 장고 (4)
      • 임베디드 시스템 (10)
      • 병렬 처리(Parallel Processing) (9)
      • 데이터 통신 Data communication (4)
      • 유닉스 시스템 (Unix System) (3)
      • GitHub (1)
      • 마이크로 프로세서 (micro processor) (1)
      • 데이터 마이닝 (1)
    • Error Note 🚨 (3)
    • 영어 공부 (6)
      • Live Academy (6)
    • HOBBY (2)
      • Film Log (2)

최근 글

정보

_rian의 butter_shower

butter_shower

_rian

나의 외부 링크

  • Github
  • Facebook
  • Instagram
  • LinkedIn
  • Twitter

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © _rian. Designed by Fraccino.

티스토리툴바