백준

백준 2470 두 용액(Java)

Park DJ 2023. 1. 30. 11:55

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

 

2470번: 두 용액

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

www.acmicpc.net


 

해석 및 팁

 


 

이 문제는 투포인터를 활용하면 쉽게 풀 수 있습니다. 먼저 배열에 수를 넣은 후 정렬 합니다. 그다음 left를 0, right를 n-1로 정한 다음 두 배열의 합이 최소일 경우 그 값을 저장하고 합이 0보다 작거나 같은 경우에는 l++ 큰 경우에는 r-- 을 해주면 됩니다.

 


 

Java 코드

 


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

public class Main {
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int n = Integer.parseInt(br.readLine());
    int[] arr = new int[n];
    int min = Integer.MAX_VALUE;
    int l = 0;
    int r = n - 1;
    int num1 = 0;
    int num2 = 0; 

    StringTokenizer st = new StringTokenizer(br.readLine());

    for(int i = 0; i < n; i++) {
      arr[i] = Integer.parseInt(st.nextToken());
    }

    Arrays.sort(arr);

    while(l < r) {
      int diff = Math.abs(arr[l] + arr[r]);
      
      if(diff < min) {
        min = diff;
        num1 = arr[l];
        num2 = arr[r];
      }
        
      else if(arr[l] + arr[r] > 0) r--;
      else if(arr[l] + arr[r] <= 0) l++;
    }

    System.out.println(num1+" "+num2);
  }
}