본문 바로가기
코딩테스트

[백준] 7453번 '합이 0인 네 정수' - Java

by CuckooBird 2023. 8. 26.

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

두 포인터를 이용했습니다.