[백준/BOJ] 2473 세 용액 - JAVA

문제
https://www.acmicpc.net/problem/2473
문제 분석
조건
-1,000,000,000 이상, 1,000,000,000 이하의 특성값을 갖는 N개의 용액이 있다. 이 중 3개의 다른 용액을 선택하여 각 용액의 특성값을 더했을 때 0과 가장 가까운 3개 용액을 구하는 문제이다.
풀이방법
우선 입력 받은 N개의 용액을 정렬한 뒤, 가장 낮은 특성값을 가진 용액을 고정시킨 뒤 탐색을 하는 방식으로 구현하였다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static long[] answer = {0, 0, 0};
static long sum = 3000000000L;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
long[] arr = new long[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Long.parseLong(st.nextToken());
}
Arrays.sort(arr);
for (int i = 0; i < N - 2 && sum != 0; i++) {
solution(arr, i);
}
System.out.println(answer[0] + " " + answer[1] + " " + answer[2]);
}
private static void solution(long[] arr, int left) {
int mid = left + 1;
int right = arr.length - 1;
while (mid < right) {
long temp = arr[left] + arr[mid] + arr[right];
if (temp == 0) {
sum = 0;
answer[0] = arr[left];
answer[1] = arr[mid];
answer[2] = arr[right];
return;
}
if (Math.abs(temp) < sum) {
answer[0] = arr[left];
answer[1] = arr[mid];
answer[2] = arr[right];
sum = Math.abs(temp);
}
if (temp < 0) {
mid++;
} else {
right--;
}
}
}
}
728x90