양수의 산성 용액이 있고 음수의 알칼리 용액이 있을 때, 나열된 용액들 중 두 개를 골라서 0에 가장 가까운 값을 만드는 문제이다.
해당 문제는 이중포인터를 사용하여 해결하면 된다. 나열된 배열에 가장 왼쪽과 오른쪽을 가르킨다. 그리고 두 개의 합이 0보다 작으면 0이 되어야하므로 왼쪽을 한 칸 밀고, 0보다 크면 오른쪽을 한 칸 당긴다. 그리고 혹시 0이 된다면 그 때의 왼쪽 오른쪽이 가르키는 값을 순서대로 출력 후 프로그램을 종료하면 된다.
하지만 주의할 점은 문제는 0의 가장 가까운 값을 찾는다는 것이다. 즉 0이 나오지 않을 수도 있다. 따라서 앞에서 두 값을 더해서 절댓값을 구한 뒤 기존의 sum값과 비교하여 더 절댓값이 작은 값일 경우 결과가 되는 resultL, resultR을 최신화 시켜주는 로직을 추가할 필요가 있다.
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
scanf_s("%d", &n);
vector<int> v(n + 1);
int l = 0;
int r = n - 1;
for (int i = 0; i < n; i++)
scanf_s("%d", &v[i]);
int sum = abs(v[0] + v[n - 1]);
int resultL = l;
int resultR = r;
while (l < r) {
int tmp = v[l] + v[r];
if (sum > abs(tmp)) {
sum = abs(tmp);
resultL = l;
resultR = r;
}
if (tmp < 0) {
l++;
}
else if (tmp == 0) { // 어차피 0일 경우 위에서 resultL과 resultR이 변경되었을 것이므로 또 처리해줄 필요 없다.
break;
}
else {
r--;
}
}
printf("%d %d", v[resultL], v[resultR]);
return 0;
}