본문 바로가기

Algorithm/문제

[백준 / JAVA] 2467. 용액(G5)

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

 

괜시리 브루트포스로 한번 풀어보고 싶어지는 문제이다.

당연히 틀리고 min값을 이정표로 투포인터를 지정했다가 또 틀렸다. 방향성은 맞는 것 같은데 왜 틀렸는가 장정 일주일 동안 고민 끝에 min값이 아니라 이전 계산값을 기준으로 포인터를 움직여야 한다는 것을 깨달았다.

 

 

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

public class Main {
	static BufferedReader br;
	static StringTokenizer st;
	static StringBuilder sb;

	public static void main(String[] args) throws Exception {
		br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int[] array = new int[n];
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < n; i++)
			array[i] = Integer.parseInt(st.nextToken());
		twoPoint(array);
		System.out.println(array[curA] + " " + array[curB]);
	}

	static int curA = 0, curB = 0, min = Integer.MAX_VALUE;

	static void twoPoint(int[] array) {
		int pStart = 0, pEnd = array.length - 1, tmp;
		while (true) {
			if (pStart >= pEnd)
				return;
			tmp = array[pStart] + array[pEnd];
			if (Math.abs(tmp) < Math.abs(min)) {
				min = tmp;
				curA = pStart;
				curB = pEnd;
			}
			if (tmp < 0) { 
					pStart++;
			} else if (tmp > 0) { 
					pEnd--;
			} else
				return;
		}
	}
}