그런데 문제를 너무 쉽게 생각했다. 투 포인터로 풀어야 했다. 질문게시판에서 문제에 대한 힌트를 얻었는데 a와 b의 합이 c와 같아야 하며, 자기자신과 같아서는 안된다는 내용이다. 그래서 set<pair<int, int>> 의 형태로 인덱스값과 자신의 값으로 문제를 풀어야할까? 아니면 map<pair<int, int>> 의 형태로 인덱스값과 자신의 값으로 문제를 풀어야할까? 라는 생각이 들었다. 결론적으로는 둘다 틀렸다.
수열을 정렬하는데 걸리는 시간 복잡도는 𝑂(𝑁log𝑁), 투포인터 알고리즘은 각 숫자 k에 대해 O(N)에 수행할 수 있고 총 N번 반복하므로 O(N^2)이다. O(NlogN)과 O(N^2)을 합해도 O(N^2)이 지배적이므로 전체 시간복잡도는 O(N^2)이다.
// test.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
int *arr = new int[N];
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
sort(arr, arr+N);
int count = 0;
for (int i = 0; i < N; i++) {
int start = 0;
int end = N-1;
int n = arr[i];
while (start < end && end>=0) {
int sum = arr[start] + arr[end];
if (sum < n) {
start++;
}
else if (sum > n) {
end--;
}
else {
if (start != i && end != i) {
count++;
break;
}
}
}
}
cout << count;
}