본문 바로가기
알고리즘

[알고리즘] 투 포인터

by 훈꽁 2021. 6. 9.

투 포인터 (Two Pointers) 알고리즘이란?

  • 리스트에 순차적으로 접근해야 할 때 2개의 점의 위치를 기록하면서 처리하는 알고리즘
  • 1차원 배열에서 두 개의 포인터를 조작하여 원하는 결과를 얻을 수 있음

쓰는 이유?

  • 시간 복잡도 단축이 제일 크다.

보통 이중 for 문을 사용하여 구하는 데, 시간 복잡도가 O(N^2) 으로 Input 값이 커지면 상당히 커진다.

투 포인터를 사용하면 시간 복잡도가 O(N+M)으로 상당히 많이 단축 된다.

부분 합이 5인 연속된 수열의 수를 구해보자!

5
1 2 3 2 5
5

1. 이중 for 문

n = int(input())
arr = list(map(int, input().split()))
x = int(input())

ans = 0
for i in range(n):
    for j in range(i+1, n):
        if arr[i] + arr[j] == x:
            ans += 1

print(ans)        # 2

 

  • 전체를 순회하면서 리스트의 두 번째부터 더해가며 부분 합을 구하는 방식
  • 시간 복잡도 O(N^2) 이다

2. 투 포인터

n = int(input())
arr = list(map(int, input().split()))
x = int(input())

arr.sort()
start, end = 0, n - 1
ans = 0
while True:
    if start >= end:
        break
    temp = arr[start] + arr[end]
    if temp == x:
        start += 1
        ans += 1
    elif temp > x:
        end -= 1
    else:
        start += 1
print(ans)        # 2

 

  • 일단 정렬하고 시작
  • 포인터를 시작과 끝에 두면서 비교를 하기 때문에 시간 복잡도를 줄일 수 있음

STEP 0 (기본)

STEP 1 (정렬)

STEP 2 (확인 후 End 옮기기)

STEP 3 (확인 후 Start 옮기기)

STEP 4 (반복)

STEP 5 (동일 위치면 Break)

백준 참고 문제집

https://www.acmicpc.net/problemset?sort=ac_desc&algo=80

 

문제 - 1 페이지

 

www.acmicpc.net

 

❤ 본 포스팅에서 지적과 좋아요는 감사하게 받겠습니다.

'알고리즘' 카테고리의 다른 글

[알고리즘] 프림(prim) 알고리즘  (0) 2021.07.07
[알고리즘] 최소 신장 트리 (MST)  (0) 2021.07.07
[알고리즘] 트리, 이진트리  (0) 2021.07.06
[알고리즘] 이분 탐색  (0) 2021.06.09

댓글