파게로그

[백준 2470번] 두 용액 본문

콤퓨타 왕왕기초/PS

[백준 2470번] 두 용액

파게 2021. 3. 2. 03:53

문제 링크: 2470번 두 용액

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

 

headtail이 각각 하나의 값들을 가리키고 있을 때, 두 값의 합 cur이 0에 가까워지고자 한다면, cur < 0일 때는 head를 오른쪽으로 옮겨주고, cur > 0일 때는 cur을 왼쪽으로 옮겨준다. 계속해서 그 차이 diff를 확인하면서, 차이가 갱신될 때마다 headtail이 가리키는 값을 저장해준다.
물론 이러한 매커니즘이 동작하려면 배열이 가장 먼저 정렬되어 있어야 한다.

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(new StringTokenizer(br.readLine()).nextToken());
        int[] arr = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();

        Arrays.sort(arr);

        int head = 0;
        int tail = n-1;
        int minDiff = Integer.MAX_VALUE;
        int minSol1 = 0;
        int minSol2 = 0;

        while (head < tail) {
            int cur = arr[head] + arr[tail];
            int diff = Math.abs(cur);

            if (diff < minDiff) {
                minDiff = diff;
                minSol1 = arr[head];
                minSol2 = arr[tail];
            }

            if (diff == 0)
                break;

            if (cur < 0) head++;
            if (cur > 0) tail--;
        }

        System.out.printf("%d %d", minSol1, minSol2);
    }
}
Comments