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);
}
}