BOJ 2473 세 용액

메모리 : 14160 KB

시간 : 168 ms

BOJ 2473 세 용액 Gold 4


풀이

투포인터 업그레이드 버전이었다..

  1. 0부터 N까지 i 값을 고정한다. (for문)
  2. 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);
	}
}