728x90
💻 알고리즘
✔️ Two-Pointer 알고리즘이란?
리스트에 순차적으로 접근할 때 두 개의 점 위치를 기록하면서 처리하는 알고리즘!
간단히 말해서 포인터 두 개를 사용해서 데이터에 접근하겠다는 소리이다.
💡 특징
- 포인터 2개가 같은 방향으로 이동 → 특정 값과 일치하는 배열을 찾는 경우
- 포인터 2개가 양끝에서 출발해서 만남 → 특정 값과 일치하는 합을 찾는 경우
- 모든 범위를 확인하지 않고 O(n^2), 포인터가 각각 N번만 이동하기 때문에 O(N)
✔️ 포인터가 같은 방향으로 이동
def two_pointer(array, target):
end, sum_ = 0, 0
cnt = 0
for start in range(len(array)):
while sum_ < target and end < len(array):
sum_ += array[end]
end += 1
if sum_ == target: cnt += 1
sum_ -= array[start]
return cnt
💡 동작 원리
- 두 포인터가 0부터 시작한다.
- 부분 합(sum_)이 target 값과 같다면 카운트 한다.
- sum_ > target 이라면 start += 1
- sum_ < target 이라면 end += 1
- 모든 경우를 확인할 때까지 2, 3, 4번을 반복한다.
구간 합(prefix sum) 알고리즘과 유사하다.
✔️ 포인터가 양끝에서부터 만남
### array는 정렬되어있어야한다. ###
def two_pointer2(array, target):
start, end = 0, len(array)-1
cnt = 0
while start < end:
tmp = array[start] + array[end]
if tmp == target: cnt += 1
if tmp < target:
start += 1
continue
end -= 1
return cnt
💡 동작 원리
- 양쪽 끝에 포인터를 지정한다.
- 포인터의 합(tmp) > target 이라면 end를 1 감소.
- tmp < target 이라면 start += 1
- tmp == target 이라면 카운트 한다.
- 두 포인터가 만날 때까지 2, 3, 4번 반복한다.
'개인 공부 > TIL' 카테고리의 다른 글
TIL : Kruskal(크루스칼) 알고리즘 (9) (0) | 2022.08.21 |
---|---|
TIL : 플로이드-워샬(Floyd-Warshall) 알고리즘 (8) (0) | 2022.08.17 |
TIL : Union-Find 알고리즘, Disjoint Set 자료구조 (6) (0) | 2022.08.07 |
TIL : 다익스트라 알고리즘 (5) (0) | 2022.08.01 |
Today I Learned : 파이썬 (4) (0) | 2022.07.17 |
댓글