https://www.acmicpc.net/problem/2470
start포인터는 0으로, end포인터는 N-1로 초기화
(start포인터와 end포인터가 엇갈리기 전까지 반복)
합이 최솟값보다 작으면 최솟값 변경해주기
합이 음수면 start포인터를 이동시켜 값을 크게 해주기
합이 양수면 end포인터를 이동시켜 값을 작게 해주기
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> v(N);
vector<int> ans(2);
for (int i = 0; i < N; i++) {
cin >> v[i];
}
sort(v.begin(), v.end()); //양쪽 끝에서 포인터 이동하는 경우는 정렬 해주기!
/* 투포인터 알고리즘 */
int start = 0, end = N-1, min = 2000000000;
while (start < end) {
int sum = v[start] + v[end];
if (min > abs(sum)) {
min = abs(sum);
ans[0] = v[start];
ans[1] = v[end];
}
if (sum < 0) start++;
else end--;
}
sort(ans.begin(), ans.end());
cout << ans[0] << " " << ans[1];
return 0;
}