바보같은 실수로 인해 다시 오랜 시간을 소비하여 다시는 이런 실수를 하지 않겠다는 마음가짐으로 적었습니다.
BOJ 7453] 합이 0 인 네 정수 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
long[][] arr = new long[N][4];
for(int i=0;i<N;i++){
String[] str = br.readLine().split(" ");
for(int j=0;j<4;j++){
arr[i][j] = Integer.parseInt(str[j]);
}
}
long[] ab = new long[N*N];
long[] cd = new long[N*N];
int idx = 0;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
ab[idx] = (arr[i][0] + arr[j][1]);
cd[idx++] = (arr[i][2] + arr[j][3]);
}
}
Arrays.sort(ab);
Arrays.sort(cd);
long cnt = 0;
long sum = 0;
int i =0;
int j = cd.length - 1;
while(i < ab.length && j >= 0){
sum = ab[i] + cd[j];
if(sum == 0){
long AB = ab[i];
long CD = cd[j];
long abCnt = 0;
long cdCnt = 0;
while(ab[i] == AB && i < ab.length ){
abCnt++;
i++;
}
while(j >= 0 && cd[j] == CD){
cdCnt++;
j--;
}
cnt += abCnt * cdCnt;
}
else if(sum > 0) j--;
else if(sum < 0) i++;
}
System.out.println(cnt);
}
}
투포인터를 이용한 방법으로 풀이를 시도하였고 틀렸던 이유는 while문의 조건 순서로 인하여 ArrayOutOfBounds의 런타임 에러가 발생하였습니다.
디버깅을 돌렸을 때 while(ab[i] == AB && i < ab.length) 에서 i++ 이후 ab[i] == AB를 먼저 조건으로 보고 있었기 때문입니다.
조건을 작성 할 때 순서를 좀 더 신경써서 작성해야 된다는 것을 깨달았던 문제였습니다.
ps) while(i < ab.length && ab[i] == AB ) 로 순서를 바꿔준다면 첫번째 조건에서 탈출하기 때문에 정상적으로 답이 나오는걸 확인 하였습니다. ㅠㅠ