서로 다른 용액을 섞어 0과 가장 가까운 조합을 찾는 문제 투포인터를 이용하면 풀 수 있다.
양 끝에서 시작해서 l과 r을 조절하면서 최적의 조합을 찾으면된다.
일단 min의 초기값은 10억 + 10억의 조합이 있을 수 있으므로 대충 21억으로 설정해둔다.
두 용액을 섞은 값은 arr[r] + arr[l]이 될 것이고, 이것의 절대값이 작으면 작을수록 0에 가까운 것이 된다.
두 용액을 섞은게 0 이상이라면 r을 줄여가면서 0과 더 가깝게 만들어주고.
두 용액을 섞은게 음수라면 l을 늘려가면서 0과 더 가깝게 만들어준다.
l과 r이 다른 그것들의 조합들 중 가장 0과 가까운 조합을 출력하면 된다.
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int []arr = new int[n];
for(int i=0;i<n;i++)
{
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int l =0 ,r=n-1;
int min = 2100000000;
int al=0,ar=n-1;
while(l<=r)
{
int val = arr[r] + arr[l];
if(l != r && Math.abs(arr[r] + arr[l])< min)
{
al= l;
ar = r;
min = Math.abs(val);
}
if(val >= 0)
{
r--;
}
else
{
l++;
}
}
System.out.println(arr[al] + " " + arr[ar]);
}
}