투 포인터를 이용해 해결하는 문제였다. 어떤 알고리즘을 사용할 것인지는 바로 생각해 냈지만 이전에 풀었던 투 포인터 문제의 풀이방식을 생각해 풀이한 탓에 꽤 오래 시간이 걸렸다.
투 포인터는 index 0, index n-1 방식과 index 0, index 1 방식 등 여러 index 방식에서 시작 할 수 있는데 나의 오답 풀이는 후자 방식으로 이는 최소값이 무엇인지 찾을때 적합하다. 지금 처럼 숫자의 조합이나 최대값, s == e가 같아지는 경우등이 존재할 경우 힘들어진다.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <vector>
using namespace std;
int n;
vector<int> v;
int good = 0;
//두개의 합
//1
//2
//3 2, 1
//4 3, 1
//5 3, 2
//6 4, 2
//7 4, 3
//8 5, 3
//9 5, 4
//10 7, 3
//완전 탐색하면 뻑날거고 투포인터?
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
if (n < 3) {
cout << 0;
return 0;
}
for (int i = 0; i < n; i++) {
int a;
cin >> a;
v.push_back(a);
}
sort(v.begin(), v.end());
for (int i = 0; i < n; i++) {
int s = 0;
int e = n-1;
while (s < e){
if (v[s] + v[e] < v[i]) {
s++;
}
else if (v[s] + v[e] > v[i]) {
e--;
}
else {
if (s == i) s++;
else if (e == i) e--;
else if(v[s] + v[e] == v[i]) {
good++;
break;
}
}
}
}
cout << good;
return 0;
}