백준 2470번: 두 용액 [이분 탐색][투 포인터][정렬] -Java :: 매운코딩
728x90
300x250

https://www.acmicpc.net/problem/2470

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

0에 가장 가까운 값을 내는 두수의 합 찾기.

정렬 후 idx = 0 부터 이분탐색을 통해 가장 0과 가까운 값을 찾아낸다.

 

 

<Java 코드>

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		//System.setIn(new FileInputStream("Test.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(st.nextToken());
		
		int arr[] = new int[N];
		
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < arr.length; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(arr);
		
		int idx1 = -1;
		int idx2 = -1;
		int sum = 2000000001;
		for (int i = 0; i < arr.length-1; i++) {
			int start = i+1;
			int end = N-1;
			while(start<=end) {
				int comp = arr[i] + arr[(start+end)/2];
				
				if(Math.abs(comp) < sum) {
					sum = Math.abs(comp);
					idx1 = i;
					idx2 = (start+end)/2;
				}
				
				if( comp < 0) {
					start = ((start+end)/2) + 1;
				}else {
					end = ((start+end)/2) - 1;
				}
			}
		}
		
		System.out.println(arr[idx1]+" "+arr[idx2]);
	}

}
728x90

+ Recent posts