오늘 풀어본 문제는 ⭐세 용액 이다!
친구가 추천해줘서 풀게 되었는데 좋은 문제라고 생각했다.
[입력]
[출력]
이 문제는 투포인터를 활용한다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine().trim());
int[] a = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
a[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(a);
long bestAbs = Long.MAX_VALUE;
long x = 0, y = 0, z = 0;
for (int i = 0; i < N - 2; i++) {
int l = i + 1;
int r = N - 1;
while (l < r) {
long sum = (long) a[i] + a[l] + a[r];
long abs = Math.abs(sum);
if (abs < bestAbs) {
bestAbs = abs;
x = a[i]; y = a[l]; z = a[r];
if (bestAbs == 0) {
System.out.println(x + " " + y + " " + z);
return;
}
}
if (sum > 0) r--;
else l++;
}
}
System.out.println(x + " " + y + " " + z);
}
}
이 코드에서 주의할 점 한 가지는
long sum = (long) a[i] + a[l] + a[r];
이 부분이다. 각 용액값은 +-10억으로 int 자료형에서 해결 가능하지만, 이렇게 3가지의 용액이 합쳐지는 구간은 int 범위를 넘을 수도 있기에 꼭 (long)으로 타입캐스팅을 해줘야 한다.
그래야 합이 int 범위가 아닌 long으로 인식 되어서 오버플로우가 안난다.