[백준 3273] https://www.acmicpc.net/problem/3273
- 투 포인터를 사용해서 A[i]+A[j]=x를 만족하는 수를 찾는다.
- 순서 상관없이 두 수의 합만 x와 일치하면 되기 때문에 오름차순으로 정렬한 뒤 start 포인터는 0번 index에서, end 포인터는 N-1번 index에서 시작해서 움직인다.
- x와 같을 때, 작을 때, 클 때의 경우를 나눠서 포인터를 움직인다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(void){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin>>N;
vector<int>A(N,0);
for(int i=0;i<N;i++){
cin>>A[i];
}
int target;
cin>>target;
int start=0, end=N-1, count=0;
sort(A.begin(),A.end()); // 오름차순 정렬
while(start<end){
if(A[start]+A[end]==target){
count++;
end--;
}
/* 목표 값과 같으면 count를 늘리고 end 포인터를 한 칸 앞으로 당김
그래야 합이 작아져서 else if 조건문으로 넘어간 뒤, 또 다른 경우를
찾을 수 있기 때문에 */
else if(A[start]+A[end]>target){
end--;
}
// 합이 크면 합을 작게 만들어주기 위해 end 포인터를 앞으로 당김
else if(A[start]+A[end]<target){
start++;
}
// 합이 작으면 합을 크게 만들어주기 위해 start 포인터를 뒤로 밀음
}
cout<<count<<'\n';
return 0;
}