알고리즘
백준 2470번 두 용액 (JAVA)
박카스마시며코딩
2021. 12. 18. 21:45
https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
문제에서 시간 제한이 1초이기 때문에 O(n^2)이 된다면 시간 초과가 나오게 된다.
그래서 저는 각각의 인덱스마다 해당하는 값의 음수 값을 바이너리 서치를 통해 찾아서 시간복잡도를 O(n * log(n))으로 낮춰서 풀었습니다.
package BOJ.BinarySearch;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_2470 {
static int a = 0, b = 0;
static int result = 2 * 1_000_000_000;
static void binarySearch(int [] input, int index ,int n){
int target = -input[index];
int start = index + 1;
int end = n - 1;
while(start <= end){
int mid = (start + end) / 2;
int now = input[index] + input[mid];
if (result > Math.abs(now)) {
a = input[index];
b = input[mid];
result = Math.abs(now);
// System.out.println(result+" "+a+" "+b);
}
if(input[mid] > target){
end = mid - 1;
}else if(input[mid] < target){
start = mid + 1;
}else{
break;
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int[] input = new int[n];
st = new StringTokenizer(br.readLine()," ");
for(int i = 0 ; i < n ; i++){
input[i] = stoi.apply(st.nextToken());
}
Arrays.sort(input);
// System.out.println(Arrays.toString(input));
for(int i = 0 ; i < n ; i++){
binarySearch(input, i, n);
}
System.out.println(a + " " + b);
}
}