[알고리즘] 백준 2470 두 용액 java

Jifrozen·2022년 8월 3일
0

Algorithm

목록 보기
60/70

2470 두 용액

정렬과 이진탐색이 모두 필요한 문제이다.
배열이 주어지고 두 값을 더해서 0에 가까운 값을 출력하는 문제이다.
두 값을 더해서 0과 가까운 값을 만들어내기 위해서
정렬을 한 후 가장 작은 값과 가장 큰 값을 차례로 더해가야한다.
여기서
-100 -30 10 25 30이라면
-100+30 = -70보다 30+-30 = 0 이 더 0과 가까운 값이기 때문에
투포인트를 이용해 이진탐색을 해야한다.
투포인트 값을 통해 합한 값을 구한 뒤 -> 기존 gap값과 비교한다.
gap보다 작으면 투포인트 값을 임시 저장한다.

public class 두_용액 {
	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		int N=Integer.parseInt(br.readLine());
		StringTokenizer st=new StringTokenizer(br.readLine());

		int[] map=new int[N];



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

		Arrays.sort(map);
        //여기까지 정렬 코드

		//이진탐색 시작
		int start=0;
		int end=N-1;
		int gap=Integer.MAX_VALUE;
		int temp1=0,temp2=0;

		while(start<end){
     		//투 포인트를 더한 값
			int sum=map[start]+map[end];
            //gap과 비교 -> gap보다 작으면 임시저장
			if(Math.abs(sum)<gap){
				gap=Math.abs(sum);
				temp1=map[start];
				temp2=map[end];
			}
            //합한 값이 0보다 크면 값을 줄여줘야 0과 가까워지기 때문에
            // end값을 앞으로 이동
			if(sum>0){
				end=end-1;
			}else{ //반대의 경우 start값을 뒤로 이동
				start=start+1;
			}
		}

		System.out.println(temp1+" "+temp2);


	}
}

0개의 댓글