투 포인터를 이용한 문제이다. 문제에서 요구하는 것은 합이 0에 가까운 두 용액을 구하는 것이다. 그래서 우선 입력받은 값들을 정렬을 해주어 첫번째 값과 마지막 값을 시작으로 합을 구해가며 반복문을 돌려주었다. 만약 두 용액의 합이 음수라면 start
위치를 다음으로 넘겨 음수 값을 낮춰주고 반대면 end
위치를 이전으로 넘겨주었다. 두 용액의 합의 절대값이 0과 가까우면 start
와 end
의 위치를 저장해주고 0이라면 바로 반복문을 멈추고 출력해주었다.
이전에 풀었던 투 포인터 문제와 유사하여 어렵지 않게 풀 수 있었다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
vector<int> v;
void solution(){
int start = 0, end = N - 1, a, b;
int sum = 2000000000;
sort(v.begin(), v.end());
while (start < end) {
int tmp = v[start] + v[end];
if (sum > abs(tmp)) {
sum = abs(tmp);
a = start;
b = end;
if (sum == 0) break;
}
if (tmp < 0) {
start++;
}
else {
end--;
}
}
cout << v[a] << " " << v[b];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++) {
int a;
cin >> a;
v.push_back(a);
}
solution();
return 0;
}