[Java] 백준 BOJ / 2467번: 용액

개미개미개·2025년 3월 16일

Algorithm

목록 보기
33/63

용액

문제


문제 설명

용액들의 특성값이 주어질때 해당 용액들을 잘 합쳐서 0에 가장 가깝게 만드는 문제이다.
문제에서 정렬된 순서로 주어지니 따로 정렬을 할 필요도 없고 그냥 왼쪽 포인터변수 하나, 오른쪽 포인터변수 하나를 이용해 문제를 풀면 된다.


구현

포인터 변수 left, right를 선언하고 가장 최솟값을 가지는 인덱스를 저장하기 위한 변수인 minLeft, minRight 까지 총 4개의 변수를 사용한다.

그리고 left 변수가 right 변수를 넘어가기 전까지 while 문을 돌리는데 일단 현재 인덱스에서의 최솟값을 구하기 위해 arr[left] + arr[right] 가 현재까지의 min 값보다 작은지 확인하고 min값보다 작다면 변수들을 아래와 같이 초기화를 해주면 된다.

long sum = arr[left] + arr[right];
if (min > Math.abs(sum)) {
	min = Math.abs(sum);
	minLeft = left;
	minRight = right;
}

이 과정까지는 가장 0에 가까운 인덱스들을 찾는 과정이고 이제 포인터들을 이동해줘야하는데
sum 이 0 이상일 때 right를 왼쪽으로 이동시키고, 그렇지 않다면 left를 오른쪽으로 이동시켜주면 된다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main_2467 {
    static int n;
    static int[] arr;
    static long min = Long.MAX_VALUE;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        n = Integer.parseInt(br.readLine());
        arr = new int[n];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr);

        int left = 0;
        int right = n - 1;
        int minLeft = 0, minRight = 0;

        while (left < right) {
            long sum = arr[left] + arr[right];
            if (min > Math.abs(sum)) {
                min = Math.abs(sum);
                minLeft = left;
                minRight = right;
            }

            if (sum >= 0) {
                right--;
            } else left++;
        }

        System.out.println(arr[minLeft] + " " + arr[minRight]);
    }
}
profile
개미는 오늘도 일을 합니다.

0개의 댓글