https://www.acmicpc.net/problem/2470
투포인터를 이용하였다.
용액들의 특성값들을 오름차순으로 정렬한다.
그 후 최소값과 최대값을 합해 sum을 구하는데,
이 sum이 0보다 작을 경우 최소값의 index(left)를 +1하고,
0보다 클 경우 최대값의 index(right)를 -1하면서 0과 가까운 값을 찾는다.
이 때 sum의 절댓값이 작아질 때 마다 0에 가까워진다는 뜻이므로 최종적으로 답으로 도출될 두 용액의 특성값(ansLeft, ansRight)을 갱신한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] input = new int[N];
for(int i=0;i<N;i++) input[i] = Integer.parseInt(st.nextToken());
Arrays.sort(input);
int left = 0;
int right = N-1;
int curSum = Integer.MAX_VALUE;
int ansLeft = input[left];
int ansRight = input[right];
while(left<right){
int sum = input[left]+input[right];
if(curSum>Math.abs(sum)){
curSum = Math.abs(sum);
ansLeft = input[left];
ansRight = input[right];
}
if(sum<0){
left++;
}
else if(sum>0){
right--;
}
else break;
}
System.out.println(ansLeft+" "+ansRight);
}
}