BOJ 2473 세 용액
메모리 : 14160 KB
시간 : 168 ms
BOJ 2473 세 용액 Gold 4
풀이
투포인터 업그레이드 버전이었다..
- 0부터 N까지 i 값을 고정한다. (for문)
 - for문 안에서 while문으로 투 포인터 계산을 한다.
 
느낀점
처음엔 시작값, 끝값을 고정하고 중간값을 for문으로 돌았는데 잘못된 방식이었다.. 
하나만 고정하고 두 개를 돌리는 거였다. 
그리고 자료형 때문에도 많이 고생했다. 
int 형끼리 더해져서 int의 범위를 넘어도 long 형 변수에 저장하면 알아서 long 형으로 저장되겠거니 했는데 아니었다. 
주어진 수를 저장하는 배열을 int로 해서 암만 더해도 long 형이 될 수 없었던 거였다….. 
배열을 long 형으로 바꿔서 문제를 해결할 수 있었다. 
int a = 1000000000;
int b = 1000000000;
int c = 1000000000;
int sum1 = a + b + c;
long sum2 = a + b + c;
long sum3 = (long)a + (long)b + (long)c;
System.out.println("sum1 : " + sum1);
System.out.println("sum2 : " + sum2);
System.out.println("sum3 : " + sum3);
sum1 : -1294967296
sum2 : -1294967296
sum3 : 3000000000
코드
import java.io.*;
import java.util.*;
public class Main {
	static int N, start, end;
	static long min, ans1, ans2, ans3;
	static long[] arr;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		arr = new long[N];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		Arrays.sort(arr);
		
		min = Long.MAX_VALUE;
		for (int i = 0; i < N; i++) {
			start = i+1;
			end = N-1;
			while (start < end) {
				long sum = arr[i] + arr[start] + arr[end];
				long gap = Math.abs(sum);
				if (gap < min) {
					min = gap;
					ans1 = arr[i];
					ans2 = arr[start];
					ans3 = arr[end];
				}
				if (sum < 0) start++;
				else end--;
			}
		}
		System.out.println(ans1 + " " + ans2 + " " + ans3);
	}
}