**입력:첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
출력:좋은 수의 개수를 첫 번째 줄에 출력한다.**
풀이
투포인터로 풀어야한다.
먼저 입력 받은 수를 오름차순으로 정렬을 실시한다.
for문을 n까지 k로 탐색한다
포인터는 left 0번째 idx
right는 n-1번째 idx
for 안에서 while (left < right)까지 포인터를 가지고 탐색한다.
left 인덱스와 right 인덱스의 원소의 합이 현재 k의 원소의 값과 같음
좋은수를 count 한다.
예외처리를 k와 left & k와 right시 해주는 이유는
0과 자기 자신으로 좋은수가 나올 수 있기 때문이다.
코드
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
int cnt = 0;
vector<int> arr(n, 0);
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
sort(arr.begin(),arr.end());
for (int k = 0; k < n; k++)
{
long find = arr[k];
int right = n - 1;
int left = 0;
while (left < right)
{
if (arr[left] + arr[right] == find)
{
if (left != k && right != k) {
cnt++;
break;
}
else if(left==k)
{
left++;
}
else if (right== k)
{
right--;
}
}
else if (arr[left] + arr[right]< find)
{
left++;
}
else
{
right--;
}
}
}
cout << cnt;
}