J

[JAVA] BOJ 백준 2470 두 용액 본문

🔑 Problem Solving/🍇 BOJ

[JAVA] BOJ 백준 2470 두 용액

snowball🐰 2023. 7. 7. 14:09

문제 바로가기

전체 코드

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

public class 두용액 {
    static int[] numbers;
    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(bf.readLine());
        numbers = new int[N];
        StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
        for(int i=0; i<N; i++){
            numbers[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(numbers); // 정렬
        int answer1 = numbers[0], answer2 = numbers[1];
        int start = 0; int end = N-1;
        while(start<end){
           if(Math.abs(numbers[start]+numbers[end]) < Math.abs(answer1+answer2)){
               answer1 = numbers[start];
               answer2 = numbers[end];
           }
           if(numbers[start]+numbers[end] < 0) start++;
           else if(numbers[start]+numbers[end] > 0) end--;
           else break;

        }

        System.out.println(answer1+" "+answer2);
    }
}

투 포인터를 사용하였다.

answer1, answer2 변수에 최솟값을 만드는 두 용액을 저장해주었다.

두 값이 갱신되는 때는 용액의 합의 절댓값이 최솟값보다 작은 경우이다.

두 용액의 합이 0보다 작다면 값을 키워주어야 0에 가까워진다. 그러므로 start를 증가시킨다.

반대로 크다면 값을 줄이기 위해 end를 줄인다.

마지막으로 합이 0이라면 더 이상 0에 가까워질 수 없으므로 루프를 바로 빠져나온다.

Comments