백준 2467번 - 용액

박진형·2021년 9월 12일
0

algorithm

목록 보기
99/111

문제 풀이

서로 다른 용액을 섞어 0과 가장 가까운 조합을 찾는 문제 투포인터를 이용하면 풀 수 있다.
양 끝에서 시작해서 l과 r을 조절하면서 최적의 조합을 찾으면된다.
일단 min의 초기값은 10억 + 10억의 조합이 있을 수 있으므로 대충 21억으로 설정해둔다.

두 용액을 섞은 값은 arr[r] + arr[l]이 될 것이고, 이것의 절대값이 작으면 작을수록 0에 가까운 것이 된다.

두 용액을 섞은게 0 이상이라면 r을 줄여가면서 0과 더 가깝게 만들어주고.
두 용액을 섞은게 음수라면 l을 늘려가면서 0과 더 가깝게 만들어준다.
l과 r이 다른 그것들의 조합들 중 가장 0과 가까운 조합을 출력하면 된다.

문제 링크

boj/2467

소스코드

PS/2467.java

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

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));


	public static void main(String[] args) throws IOException {
		int n = Integer.parseInt(br.readLine());
		StringTokenizer 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 min = 2100000000;
		int al=0,ar=n-1;
		while(l<=r)
		{
			int val = arr[r] + arr[l];
			if(l != r && Math.abs(arr[r] + arr[l])< min)
			{
				al= l;
				ar = r;
				min = Math.abs(val);
			}
			if(val >= 0)
			{
				r--;
			}
			else
			{
				l++;
			}
		}
		System.out.println(arr[al] + " " + arr[ar]);
	}

}


0개의 댓글