August 30, 2022
백준 문제 링크 : https://www.acmicpc.net/problem/7453
4가지 배열이 주여질때, 각 배열의 합이 0이 되는 (a,b,c,d) 쌍의 개수를 구해야한다.
배열의 크기가 4000개이지만 이를 완전탐색으로하면 4000*4000*4000*4000 이라는 어마무시한 수가 나온다.
ArrayList는 가급적이면 지양하자…
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
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[] A = new long[N];
long[] B = new long[N];
long[] C = new long[N];
long[] D = new long[N];
StringTokenizer st = null;
for(int i=0; i<N; i++){
st = new StringTokenizer(br.readLine());
A[i] = Integer.parseInt(st.nextToken());
B[i] = Integer.parseInt(st.nextToken());
C[i] = Integer.parseInt(st.nextToken());
D[i] = Integer.parseInt(st.nextToken());
}
long[] abSum = new long[N*N];
long[] cdSum = new long[N*N];
int idx = 0;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
abSum[idx] = A[i] + B[j];
cdSum[idx] = C[i] + D[j];
idx++;
}
}
Arrays.sort(abSum);
Arrays.sort(cdSum);
long answer = 0;
int abP = 0;
int cdP = idx-1;
while (true) {
long valAB = abSum[abP];
long valCD = cdSum[cdP];
long sum = valAB + valCD;
if(sum > 0){
cdP--;
} else if(sum == 0){
int abCnt = 0;
int cdCnt = 0;
while(abP < idx && abSum[abP] == valAB){
abP++;
abCnt++;
}
while(cdP >= 0 && cdSum[cdP] == valCD){
cdP--;
cdCnt++;
}
answer += (long) abCnt * cdCnt;
} else{
abP++;
}
if(abP >= idx || cdP < 0) break;;
}
System.out.println(answer);
}
}
아이디어는 빨리 나왔지만 관련해서 몰랐던 것들이 많아 문제를 푸는데 오래 걸렸다.