쫑쫑이의 블로그

백준 2467 용액 Java [투포인터] 본문

알고리즘/백준

백준 2467 용액 Java [투포인터]

쫑쫑2 2022. 11. 16. 01:50

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

 

2467번: 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -

www.acmicpc.net

 

입력값이 오름차순으로 정렬된 배열이므로,

왼쪽 끝과 오른쪽 끝값을 조건에 따라 하나씩 늘리거나 줄여가면서

0과 가장 가까운 값을 저장하고 출력한다

음수도 나올 수 있으니까 더했을 때 음수면 왼쪽값을 늘리고, 양수면 오른쪽 값을 줄인다

 

import java.awt.*;
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));
        int N = Integer.parseInt(br.readLine());
        int[] solutions = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int min = Math.abs(solutions[0] + solutions[N - 1]);
        Point point = new Point(solutions[0], solutions[N - 1]);

        int l = 0, r = N - 1;
        while (l < r) {
            int now = solutions[l] + solutions[r];
            if (min > Math.abs(now)) {
                min = Math.abs(now);
                point = new Point(solutions[l], solutions[r]);
            }
            if (now < 0) l++;
            else if (now > 0) r--;
            else break;
        }

        System.out.println(point.x + " " + point.y);
    }
}