두 용액 혼합하여 특성값이 0에 가장 가까운 용액
용액의 수 : 2 이상, 100000 이하
이분탐색할 것 = 두 용액
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.valueOf(br.readLine());
int[] list = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Arrays.sort(list);
int[] result = calculateArr(list, N);
bw.write(result[0] + " " + result[1] + "\n");
bw.flush();
bw.close();
}
static int[] calculateArr(int[] list, int N) {
int start = 0;
int end = N - 1;
// 두 수가 모두 양수 최대값일 때 나올 수 있는 값
int maxDiff = 2000000000;
int[] result = new int[2];
while (start < end) {
int sum = list[start] + list[end];
// 0에 더 가까운 수를 찾기 위함이니까 절댓값으로 비교한다
if (Math.abs(sum) < maxDiff) {
result[0] = list[start];
result[1] = list[end];
maxDiff = Math.abs(sum);
}
// 이분탐색할 것 = 배열 안에서 숫자들의 합
// 합이 0보다 크다는 것 = end번째 수의 절댓값이 start번째 수의 절댓값보다 크다는 의미
if (sum > 0)
// end(인덱스) 줄여주기
end--;
else
// start(인덱스) 증가시키기
start++;
}
return result;
}
}