https://www.acmicpc.net/problem/7453
7453번: 합이 0인 네 정수
첫째 줄에 배열의 크기 n (1 ≤ n ≤ 4000)이 주어진다. 다음 n개 줄에는 A, B, C, D에 포함되는 정수가 공백으로 구분되어져서 주어진다. 배열에 들어있는 정수의 절댓값은 최대 228이다.
www.acmicpc.net
문제
코드
import java.io.*;
import java.util.*;
public class Main {
private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(bf.readLine());
int[] A = new int[n];
int[] B = new int[n];
int[] C = new int[n];
int[] D = new int[n];
for(int i = 0 ; i < n ; i++) {
StringTokenizer st = new StringTokenizer(bf.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());
}
int[] AB = new int[n * n];
int[] CD = new int[n * n];
int idx = 0;
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < n ; j++) {
AB[idx] = A[i] + B[j];
CD[idx++] = C[i] + D[j];
}
}
Arrays.sort(AB);
Arrays.sort(CD);
long ans = 0;
int start = 0, end = n * n - 1;
while(start < n * n && end >= 0) {
if(AB[start] + CD[end] < 0) start ++;
else if(AB[start] + CD[end] > 0) end --;
else {
long leftCnt = 1, rightCnt = 1;
while(start + 1 < n * n && (AB[start] == AB[start + 1])) {
leftCnt ++;
start ++;
}
while(end > 0 && (CD[end] == CD[end - 1])) {
rightCnt ++;
end --;
}
ans += leftCnt * rightCnt;
start ++;
}
}
bw.write(ans + "\n");
bf.close();
bw.flush();
bw.close();
}
}
두 포인터를 이용했습니다.
'코딩테스트' 카테고리의 다른 글
[백준] 1461번 '도서관' - Java (1) | 2023.08.28 |
---|---|
[백준] 1103번 '게임' - Java (1) | 2023.08.27 |
[백준] 1162번 '도로포장' - Java (0) | 2023.08.25 |
[백준] 1234번 '크리스마스 트리' - Java (0) | 2023.08.23 |
[백준] 1208번 '부분수열의 합 2' - Java (0) | 2023.08.22 |