JAVA/Coding Test

[JAVA] 백준 2470 두 용액_투포인터

오늘도개발 2024. 6. 3. 19:11

 

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

 

접근 : 

 

 - 들어온 배열을 오름차순으로 정렬한다.

 

 - 왼쪽과 오른쪽 끝에 포인터를 두고, 합이 양수이면 오른쪽 포인터를 1내리고 음수 이면 왼쪽 포인터를 1 올린다.

 

 - 선택 한 두 용액이 0 이되면 출력을 하고, 0 이 아니면 0에 가까운 수를 갱신한다. 

 

 

코드구현 

 

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(br.readLine());
        String[] temp = br.readLine().split(" ");
        List<Integer> nums = new ArrayList<>(100_000);

        for(int i = 0; i < n ; i++) nums.add(Integer.parseInt(temp[i]));
        Collections.sort(nums);

        int left = 0;
        int right = n-1;
        int[] res = new int[2];

        int near_zero = 2_000_000_001;
        int temp_min = 0;
        int flag = 1;

        while(left < right){
            temp_min = nums.get(left) + nums.get(right);

            if(temp_min == 0){
                res[0] = nums.get(left);
                res[1] = nums.get(right);
                break;
            }

            flag = temp_min > 0 ? 1 : -1;

            // 0 에 더 근접하면 정답 갱신
            if(temp_min * flag < near_zero){
                res[0] =  nums.get(left);
                res[1] =  nums.get(right);
                near_zero = temp_min * flag;
            }

            if(flag > 0){
                right--;
                continue;
            }
            left++;
        }
        System.out.println(sb.append(res[0]).append(' ').append(res[1]).toString());
        br.close();
    }
}