왼쪽, 오른쪽에서 시작하여서 가운데를 향하면 된다.
왼쪽, 오른쪽 중 가운데로 이동하였을 때 더 0에 가까운 경우를 골라서 이동시켜 주면 된다.
#include <iostream>
#include <vector>
using namespace std;
int abs(int num)
{
return num < 0 ? -num : num;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
int N;
cin >> N;
vector<int> v(N);
for (int i = 0; i < N; ++i)
cin >> v[i];
int left = 0, right = N - 1, leftNum = v[0], rightNum = v[N - 1];
while (left < right)
{
int sum = abs(v[left] + v[right]);
if (abs(leftNum + rightNum) > sum)
{
leftNum = v[left];
rightNum = v[right];
}
if (abs(v[left + 1] + v[right]) < abs(v[left] + v[right - 1]))
++left;
else
--right;
}
cout << leftNum << " " << rightNum;
return 0;
}
입력이 정렬해서 주어지기에 따로 정렬해 줄 필요는 없다.
진행하면서 왼쪽, 오른쪽 합이 0에 가장 가까운 왼쪽, 오른쪽 인덱스를 저장해 주고 출력하면 된다.