[알고리즘] 투포인터
[알고리즘] 투포인터
투포인터
- 배열이나 리스트에서 ‘두 개의 포인터’를 사용하여 ‘특정 조건을 만족하는 부분 구간’을 효율적으로 탐색하는 알고리즘
- 보통은 왼쪽 포인터와 오른쪽 포인터를 사용하며, 이들은 각각 탐색 범위의 시작과 끝을 가리킴
- 탐색 범위 내에서 특정 조건을 만족하는 요소를 찾거나, 조건을 만족하는 부분 배열의 길이 등을 계산하는 데 사용
- 투 포인터의 수행 단계
- 배열 또는 리스트의 시작 위치에 첫 번째 포인터와 두 번째 포인터를 설정
- 두 포인터 사이의 구간을 조사하고 조건을 확인
- 조건을 만족할 경우, 원하는 결과를 얻었으므로 알고리즘을 종료
- 조건을 만족하지 않을 경우, 첫 번째 또는 두 번째 포인터를 이동
- 다시 2번 단계로 돌아가 반복
시간 복잡도
- 일반 : O(N)
- 정렬 후 투포인터 : O(NlgN)
자료 구조
- 배열 혹은 리스트
예시 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int,input().split()))
ans = sys.maxsize
left, right = 0, n - 1
arr.sort()
x, y = 0, n - 1
while x < y:
mix = arr[x] + arr[y]
if abs(mix) < ans:
ans = abs(mix)
left = x
right = y
if mix > 0:
y -= 1
elif mix < 0:
x += 1
else:
break
print(arr[left], arr[right])
This post is licensed under CC BY 4.0 by the author.