알고리즘/BOJ

[BOJ] 2470. 두 용액

재담 2022. 4. 5. 01:46

문제 원본 : https://www.acmicpc.net/problem/2470

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

import java.io.*;
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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());
        int[] 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);

        StringBuilder builder = new StringBuilder();
        if (arr[0] > 0) {
            builder.append(arr[0]).append(" ").append(arr[1]);
        } else if (arr[n - 1] < 0) {
            builder.append(arr[n - 2]).append(" ").append(arr[n - 1]);
        } else {
            int left = 0, right = n - 1, max = Integer.MAX_VALUE;
            int[] ans = new int[2];

            while (true) {
                int tmp = Math.abs(arr[left] + arr[right]);
                if (tmp < max) {
                    ans[0] = arr[left];
                    ans[1] = arr[right];
                    max = tmp;
                }

                if (right - left == 1 || max == 0) {
                    builder.append(ans[0]).append(" ").append(ans[1]);
                    break;
                }

                if (Math.abs(arr[left] + arr[right - 1]) < Math.abs(arr[left + 1] + arr[right])) {
                    --right;
                } else {
                    ++left;
                }
            }
        }

        bw.write(builder.toString());

        bw.close();
        br.close();
    }
}
  • 정렬과 투 포인터를 활용한 문제
  • 모두 양수이거나 모두 음수인 경우를 예외 처리해주었다.
  • left를 옮기는 것과 right를 옮기는 것을 비교해 0에 더 가까운 쪽으로 포인터를 옮기면 해결 가능하다.

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 5721. 사탕 줍기 대회  (0) 2022.04.07
[BOJ] 1976. 여행 가자  (0) 2022.04.06
[BOJ] 1715. 카드 정렬하기  (0) 2022.04.04
[BOJ] 1057. 토너먼트  (0) 2022.04.03
[BOJ] 9375. 패션왕 신해빈  (0) 2022.04.02