본문 바로가기
Algorithm/etc

[파이썬, 자바] 백준 2470 : 두 용액 (골드5)

by 베짱이28호 2025. 2. 7.

[파이썬, 자바] 백준 2470 : 두 용액 (골드5)


풀이

방향성 생각

  • 투포인터 / 이분탐색인데 투포인터로 풀었다.
  • 투포인터도 시작점에서 같이 시작하냐, 양 끝에서 조이냐 선택을 해야한다.
  • window 내에서 개수나 합 등을 계속 측정해야하면 시작점에서 같이 시작해서 조건을 만족하는 최대 window 등을 찾으면 left pointer를 이동시킨다.
  • 이 문제에서는 window의 길이와 관계 없이 양 끝 포인터의 합을 더해주면서 포인터를 조절해주면 된다.

 


파이썬

N = int(input())
arr = sorted(map(int,input().split()))

l,r = 0,N-1
min_sum = float('inf')
answer = None

while l < r:
    temp = arr[l] + arr[r]
    if abs(temp) < min_sum:
        min_sum = abs(temp)
        answer = (arr[l],arr[r])
    if temp < 0:
        l += 1
    elif temp > 0:
        r -= 1
    else:
        break
print(*answer)

자바

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());

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

        int l=0, r = N-1;
        int minSum = Integer.MAX_VALUE;
        int[] answer = new int[2];

        while (l<r) {
            int temp = arr[l] + arr[r];

            if (Math.abs(temp) < Math.abs(minSum)) {
                minSum = temp;
                answer[0] = arr[l];
                answer[1] = arr[r];
            }

            if (temp < 0) {
                l++;
            } else if (temp > 0) {
                r--;
            } else {
                break;
            }
        }
        System.out.println(answer[0] + " " + answer[1]);
    }
}

코멘트

  • .

댓글