문제링크: https://www.acmicpc.net/problem/2470
투 포인터 문제이다.
처음에 입력을 sort한 후 포인터 하나는 맨 앞에서부터 시작하고 나머지 하나는 맨 뒤에서부터 시작해서, 둘의 합이 0에 가까운 수를 찾으면 되는 간단한 문제이다.
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
int N;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N;
vector<long long> v;
long long temp;
for(int i = 0 ; i < N ; i++){
cin >> temp;
v.push_back(temp);
}
sort(v.begin(), v.end());
int start = 0; int end = N - 1;
long long minNum = v[start] + v[end];
int lIdx = start ; int rIdx = end;
while(start < end){
long long curDiff = v[start] + v[end];
if(abs(curDiff) < abs(minNum)){
minNum = curDiff;
lIdx = start;
rIdx = end;
}
if(curDiff <= 0) start++;
else end--;
}
cout << v[lIdx] << " " << v[rIdx] << "\n";
}