Recent Posts
Recent Comments
라떼는말이야
투포인터(two pointer) 파이썬 구현 본문
반응형
투 포인터(two pointer)
배열에서 두 개의 포인터를 이용해 양 끝에서 탐색해 나가며 답을 찾는 방식
Q. 주어진 배열에서 합이 27인 경우를 찾아라
- 최초에 맨 끝인 1과 28을 가리킨다.
- 찾아야 하는 값(27)이 29보다 작으므로 오른쪽 포인터를 하나 감소시킨다. (1, 25 가리킴)
- 찾아야 하는 값(27)이 26보다 크므로 왼쪽 포인터를 하나 증가시킨다. (3, 25)
- 찾아야 하는 값(27)이 28보다 작으므로 오른쪽 포인터를 하나 감소시킨다. (3, 22)
- 찾아야 하는 값(27)이 25보다 크므로 왼쪽 포인터를 하나 증가시킨다. (5, 22)
- 찾아야 하는 값(27)이 두 포인터가 가리키는 값의 합과 같으므로 5와 22를 return 한다.
- 또 다른 순서쌍이 존재할 수 있으니 계속 진행한다. (중복된 값이 없기 때문에 양쪽 포인터를 모두 진행시킨다) (6, 19)
- 찾아야 하는 값(27)이 25보다 크므로 왼쪽 포인터를 하나 증가시킨다. (9, 19)
- 찾아야 하는 값(27)이 28보다 작으므로 오른쪽 포인터를 하나 감소시킨다. (9, 17)
- 찾아야 하는 값(27)이 26보다 크므로 왼쪽 포인터를 하나 증가시킨다. (11, 17)
- 찾아야 하는 값(27)이 28보다 작으므로 오른쪽 포인터를 하나 감소시킨다. (11, 16)
- 찾아야 하는 값(27)이 두 포인터가 가리키는 값의 합과 같으므로 11과 16을 return 한다.
- 또 다른 순서쌍이 존재할 수 있으니 계속 진행한다. (중복된 값이 없기 때문에 양쪽 포인터를 모두 진행시킨다) (12 = 12)
- 찾아야 하는 값(27)은 24와 같지 않다.
- 더 진행하면 더 이상 l ≤ r 조건을 만족하지 않기 때문에 종료한다.
구현
arr = [3, 9, 25, 22, 1, 6, 5, 11, 19, 28, 17, 12, 16] # 주어진 배열. 중복 수 없음
S = 27 # 목표 합계
arr.sort()
l, r = 0, len(arr) - 1
while l <= r:
if arr[l] + arr[r] > S:
r -= 1
elif arr[l] + arr[r] < S:
l += 1
elif arr[l] + arr[r] == S:
print(l, '번째 수 (', arr[l], ') + ', r, '번째 수 (', arr[r], ')')
r -= 1
l += 1
결과
반응형
'알고리즘' 카테고리의 다른 글
[solved.ac 실버3] 14426_접두사 찾기 (파이썬, 문자열) (0) | 2022.06.29 |
---|---|
[Python] 리스트의 특정 원소 모두 제거하기 (6) | 2021.08.22 |
[Python] 계수 정렬 (Count sort) (2) | 2021.08.21 |
[Python] Quick sort. 파이썬에서 간단히 퀵 정렬 구현 (3) | 2021.08.21 |
[프로그래머스 lv2] 괄호 변환 (파이썬) (0) | 2021.07.23 |
깊이 우선 탐색(DFS, Depth First Search) 파이썬 구현 (0) | 2021.06.26 |
너비 우선 탐색(BFS, Breadth First Search) 파이썬 구현 (0) | 2021.05.23 |
Comments