백준 2467 용액 [자바]

baekjoon 2467 용액

java

문제 분석

  • 산성과 알칼리를 나타내는 정수가 있음.
    • 산성 1 ~ 10억
    • 염기성 -10억 ~ -1
  • 용액을 혼합하면, 각 용액 특성의 합으로 용액의 특성이 결정됨.
  • 주어진 용액 중 두 개를 합쳐서, 0에 가까운 특성을 만들 수 있는 용액 두 개 선정 & 출력

입력조건

용액의 수 N
N개의 용액 특성

풀이과정

  • 투포인터를 사용.
  • 맨 처음 인덱스와 맨 끝 인덱스에 포인터를 두고, 이 둘을 더해서 초기 비교값을 만들고 시작.
  • 정답 배열에 맨 왼쪽, 맨 오른쪽 것을 넣어두고,
  • 두 포인터가 가리키는 값이 0에 가까워지는 방향으로 포인터를 이동시키며, 만약 현재 대조군보다 작은 값을 발견한다면, 대조군과 비교값을 변경.
  • 위 과정을 두 포인터가 같은 위치에 올 때 까지 진행.

  • 시간초과로 굉장히 애를 먹이는 문제ㅠㅠ

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.stream.Stream;

public class BJ2467_용액 {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int[] nums = Stream.of(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
		int[] ans = new int[2];
		int l = 0;
		int r = N-1;
		
		int prop = Integer.MAX_VALUE;
		
		while(l < r) {
			int tmpprop = nums[l] + nums[r];
			if(prop > Math.abs(tmpprop)) {
				prop = Math.abs(tmpprop);
				ans[0] = nums[l];
				ans[1] = nums[r];
			}

			if	   (tmpprop < 0) l++;
			else if(tmpprop > 0) r--;
			else {
				// 여기 들어오면, 그냥 출력하고 끝내도 됨.
				System.out.println(nums[l] + " " + nums[r]);
				return;
			}
		}
		System.out.println(ans[0] + " " + ans[1]);
	}
}