JAVA/문제 풀이

[백준 / BOJ] 2470번 : 두 용액 - JAVA

ahue 2023. 9. 19. 22:40
728x90

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

 

2470번: 두 용액

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

www.acmicpc.net

이분 탐색

용액의 특성값을 정렬한 뒤, 두 개의 용액을 양 끝에서부터 더해보면 되므로 이분 탐색으로 풀었다. start와 end 값을 더한 절대값의 최소값을 찾기 위해 min이라는 변수를 두고, 항상 절대값으로만 비교하도록 했다.

 

물론 위 코드로도 답을 찾을 수 있지만 용액의 특성값이 모두 음수, 혹은 모두 양수인 경우에는 굳이 이분 탐색을 돌릴 필요가 없기 때문에 따로 조건문을 추가했다. (그런데 백준에서 돌렸을 때 조건문이 없는 버전이 더 빠르고 메모리도 적게 써서 의문이다)

 

전체 코드

// 시간 : 280ms
// 메모리 : 31288KB
public class Main {

	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[] liquid = new int[N];
		
		for (int i = 0; i < N; i++) {
			liquid[i] = Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(liquid);
		
		if(liquid[0] > 0) {
			System.out.println(liquid[0] + " " + liquid[1]);
			return;
		} else if(liquid[N - 1] < 0) {
			System.out.println(liquid[N - 2] + " " + liquid[N - 1]);
			return;
		}
		
		int start = 0;
		int end = N - 1;
		int min = Integer.MAX_VALUE;
		
		int ans1 = 0;
		int ans2 = 0;
		
		while(start < end) {
			
			int sum = liquid[start] + liquid[end];
			if(Math.abs(sum) < min) {
				min = Math.abs(sum);
				ans1 = liquid[start];
				ans2 = liquid[end];
			}
			
			if(sum == 0) {
				ans1 = liquid[start];
				ans2 = liquid[end];
				break;
			} else if(sum > 0) {
				end--;
			} else {
				start++;
			}
		}
		
		System.out.println(ans1 + " " + ans2);
	}

}
반응형