코딩테스트/투포인터

[골드5] 백준 2467 용액 투 포인터(Java)

정재익 2025. 7. 30. 20:48

이분탐색으로도 풀 수 있다고 하던데 전 투 포인터로 풀었습니다.

 

package org.problem.투포인터;

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

// 골드 5 용액
// 시간 제한 1초 수는 10만 n(logN)까지 허용
public class b2467 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        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());
        }

        // 0에 가장 가까운걸 만들어내려면? 양 끝에서부터 탐색한다고하자
        // 만약 양 끝해서 했을때 0을 초과할때가 있을 것 그럼 끝에것을 한 칸 내려야한다
        // 0보다 안되면? 그럼 덜빼야하니까 앞에 것을 늘려야한다
        // 그리고 딱 0이면 break하고 출력하면되는데 그게 아니면 중간결과가 최선의 결과일수도 있으니 값은 저장해둔다
      

        int[] result = new int[2];

        int start = 0;
        int end = arr.length - 1;
        result[0] = arr[start];
        result[1] = arr[end];

        while (start < end) {
            if (arr[end] + arr[start] == 0) {
                result[0] = arr[start];
                result[1] = arr[end];
                break;
            }

            if (arr[end] + arr[start] > 0) {
                if (Math.abs(arr[end] + arr[start]) < Math.abs(result[0] + result[1])) {
                    result[0] = arr[start];
                    result[1] = arr[end];
                }
                end -= 1;
            } else {
                if (Math.abs(arr[end] + arr[start]) < Math.abs(result[0] + result[1])) {
                    result[0] = arr[start];
                    result[1] = arr[end];
                }
                start += 1;
            }
        }
        System.out.println(result[0] + " " + result[1]);
    }
}