
용액들의 특성값이 주어질때 해당 용액들을 잘 합쳐서 0에 가장 가깝게 만드는 문제이다.
문제에서 정렬된 순서로 주어지니 따로 정렬을 할 필요도 없고 그냥 왼쪽 포인터변수 하나, 오른쪽 포인터변수 하나를 이용해 문제를 풀면 된다.
포인터 변수 left, right를 선언하고 가장 최솟값을 가지는 인덱스를 저장하기 위한 변수인 minLeft, minRight 까지 총 4개의 변수를 사용한다.
그리고 left 변수가 right 변수를 넘어가기 전까지 while 문을 돌리는데 일단 현재 인덱스에서의 최솟값을 구하기 위해 arr[left] + arr[right] 가 현재까지의 min 값보다 작은지 확인하고 min값보다 작다면 변수들을 아래와 같이 초기화를 해주면 된다.
long sum = arr[left] + arr[right];
if (min > Math.abs(sum)) {
min = Math.abs(sum);
minLeft = left;
minRight = right;
}
이 과정까지는 가장 0에 가까운 인덱스들을 찾는 과정이고 이제 포인터들을 이동해줘야하는데
sum 이 0 이상일 때 right를 왼쪽으로 이동시키고, 그렇지 않다면 left를 오른쪽으로 이동시켜주면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main_2467 {
static int n;
static int[] arr;
static long min = Long.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(br.readLine());
arr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int left = 0;
int right = n - 1;
int minLeft = 0, minRight = 0;
while (left < right) {
long sum = arr[left] + arr[right];
if (min > Math.abs(sum)) {
min = Math.abs(sum);
minLeft = left;
minRight = right;
}
if (sum >= 0) {
right--;
} else left++;
}
System.out.println(arr[minLeft] + " " + arr[minRight]);
}
}