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

두 용액

이분탐색 혹은 투포인터 문제입니다.
구간 내에서 2개의 용액을 더해서 0에 근접한 용액을 찾는 문제입니다.
풀이 방법은 이분탐색 혹은 투포인터가 가능한데 저는 투포인터로 풀었습니다.
먼저 배열을 오름차순 정렬합니다.
포인터인 l과 r을 정의합니다. 이 때 l은 0번 idx, r은 N-1번 idx로 정의합니다.
이후 반복문을 돌면서 각 포인터가 가지는 idx의 용액의 합을 구합니다.
만약 합이 0보다 작다면 포인터 l을 오른쪽으로 옮깁니다.
반대로 합이 0보다 크거나 같다면 포인터 r을 왼쪽으로 옮깁니다.
그리고 매번 합의 최솟값과 최소 위치를 정의합니다.

import java.io.*;
import java.util.*;
public class Main {

    static int N;
    static int[] arr,ans = new int[2];
    static long mn = (long)Long.MAX_VALUE;

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(bf.readLine());
        arr = new int[N];
        StringTokenizer st = new StringTokenizer(bf.readLine());
        for (int i = 0; i < N; i++) arr[i] = Integer.parseInt(st.nextToken());
        Arrays.sort(arr);
        int l = 0, r = N-1;
        while(l<r){
            long sum = (long)arr[l] + (long)arr[r];
            if(Math.abs(sum)<mn){
                mn = Math.abs(sum);
                ans[0] = arr[l];
                ans[1] = arr[r]; 
            }
            if(sum>0) r--;
            else l++;
        }
        System.out.println(ans[0] + " " + ans[1]);
    }
}

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

[백준 2457] 공주님의 정원  (0) 2021.01.05
[프로그래머스] 보석 쇼핑  (0) 2021.01.03
[백준 1806] 부분합  (0) 2021.01.01
[백준 20167] 꿈틀꿈틀 호석 애벌레 - 기능성  (0) 2020.12.29
[백준 1360] 되돌리기  (0) 2020.06.05

+ Recent posts