배열이나 리스트와 같은 선형 자료 구조에서 두 개의 포인터를 사용하여 정렬된 배열에서 특정 조건을 만족하는 부분배열또는 원하는 값을 찾는 등의 문제를 풀 때 주로 사용하는 알고리즘!
투포인터알고리즘은두개의포인터를사용
● 왼쪽포인터(LeftPointer) : 배열의시작지점에서시작하여오른쪽으로이동
● 오른쪽포인터(Right Pointer):배열의끝지점에서시작하여왼쪽으로이동 또는 왼쪽포인터와함께배열의시작지점에서시작하여오른쪽으로이동
#include <bits/stdc++.h> // C++ 표준 라이브러리 헤더
using namespace std;
int n, ret, x; // n: 배열 크기, ret: 조건을 만족하는 쌍의 개수, x: 목표 합
int main() {
cin >> n; // 배열 크기 입력
vector<int> a(n); // 크기가 n인 벡터 생성
// 배열 요소 입력
for (int i = 0; i < n; i++) {
cin >> a[i];
}
cin >> x; // 목표 합 입력
// 배열을 오름차순으로 정렬
sort(a.begin(), a.end());
int l = 0, r = n - 1; // 두 포인터 초기화 (왼쪽 포인터 l, 오른쪽 포인터 r)
// 투 포인터 알고리즘으로 배열 탐색
while (l < r) {
// 두 포인터가 가리키는 값을 더함
if (a[l] + a[r] == x) { // 두 수의 합이 x와 같은 경우
r--; // 오른쪽 포인터 이동
ret++; // 조건을 만족하는 쌍의 개수 증가
} else if (a[l] + a[r] > x) {
r--; // 합이 x보다 크면 오른쪽 포인터 감소
} else if (a[l] + a[r] < x) {
l++; // 합이 x보다 작으면 왼쪽 포인터 증가
}
}
cout << ret << "\n"; // 조건을 만족하는 쌍의 개수 출력
}
7
1 2 3 4 5 6 7
9
2
이분 탐색 //(Binary Search) (0) | 2025.01.22 |
---|---|
그리디 알고리즘 (Greedy Algorithm) (0) | 2025.01.21 |
postOrder, preOrder, inOrder (1) | 2025.01.21 |
DFS(Depth First Search) (0) | 2025.01.20 |
그리디 알고리즘 (Greedy Algorithm) (1) | 2025.01.19 |