정렬과 이진탐색이 모두 필요한 문제이다.
배열이 주어지고 두 값을 더해서 0에 가까운 값을 출력하는 문제이다.
두 값을 더해서 0과 가까운 값을 만들어내기 위해서
정렬을 한 후 가장 작은 값과 가장 큰 값을 차례로 더해가야한다.
여기서
-100 -30 10 25 30이라면
-100+30 = -70보다 30+-30 = 0 이 더 0과 가까운 값이기 때문에
투포인트를 이용해 이진탐색을 해야한다.
투포인트 값을 통해 합한 값을 구한 뒤 -> 기존 gap값과 비교한다.
gap보다 작으면 투포인트 값을 임시 저장한다.
public class 두_용액 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int N=Integer.parseInt(br.readLine());
StringTokenizer st=new StringTokenizer(br.readLine());
int[] map=new int[N];
for(int i=0;i<N;i++){
map[i]=Integer.parseInt(st.nextToken());
}
Arrays.sort(map);
//여기까지 정렬 코드
//이진탐색 시작
int start=0;
int end=N-1;
int gap=Integer.MAX_VALUE;
int temp1=0,temp2=0;
while(start<end){
//투 포인트를 더한 값
int sum=map[start]+map[end];
//gap과 비교 -> gap보다 작으면 임시저장
if(Math.abs(sum)<gap){
gap=Math.abs(sum);
temp1=map[start];
temp2=map[end];
}
//합한 값이 0보다 크면 값을 줄여줘야 0과 가까워지기 때문에
// end값을 앞으로 이동
if(sum>0){
end=end-1;
}else{ //반대의 경우 start값을 뒤로 이동
start=start+1;
}
}
System.out.println(temp1+" "+temp2);
}
}