알고리즘

백준 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);
    }
}