[백준 2470]두 용액(Java)

kjihye0340·2021년 5월 24일
0

baekjoon

목록 보기
10/16

문제

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

풀이

투포인터를 이용하였다.
용액들의 특성값들을 오름차순으로 정렬한다.
그 후 최소값과 최대값을 합해 sum을 구하는데,
이 sum이 0보다 작을 경우 최소값의 index(left)를 +1하고,
0보다 클 경우 최대값의 index(right)를 -1하면서 0과 가까운 값을 찾는다.
이 때 sum의 절댓값이 작아질 때 마다 0에 가까워진다는 뜻이므로 최종적으로 답으로 도출될 두 용액의 특성값(ansLeft, ansRight)을 갱신한다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    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[] input = new int[N];
        for(int i=0;i<N;i++) input[i] = Integer.parseInt(st.nextToken());
        Arrays.sort(input);

        int left = 0;
        int right = N-1;

        int curSum = Integer.MAX_VALUE;
        int ansLeft = input[left];
        int ansRight = input[right];
        while(left<right){
            int sum = input[left]+input[right];

            if(curSum>Math.abs(sum)){
                curSum = Math.abs(sum);
                ansLeft = input[left];
                ansRight = input[right];
            }
            if(sum<0){
                left++;
            }
            else if(sum>0){
                right--;
            }
            else break;
        }
        System.out.println(ansLeft+" "+ansRight);
    }
}

0개의 댓글