Algorithm/정렬(Sort)

[백준 7453번] 합이 0인 네 정수 (Java 풀이)

agility 2022. 4. 29. 13:07

백준알고리즘 7453번 : 합이 0인 네 정수 (Solved.ac 난이도 Gold2)

 

 

https://www.acmicpc.net/problem/7453

 

7453번: 합이 0인 네 정수

첫째 줄에 배열의 크기 n (1 ≤ n ≤ 4000)이 주어진다. 다음 n개 줄에는 A, B, C, D에 포함되는 정수가 공백으로 구분되어져서 주어진다. 배열에 들어있는 정수의 절댓값은 최대 228이다.

www.acmicpc.net

 

 

 

첫번째로 간과한 부분은 12초가 꽤 러프하다고 생각하여 단순 계산으로 시도해본 것이고,

두번째로 간과한 부분은 속도를 높이기 위해 투 포인터 방식을 사용했으나

동일한 연산에 대하여 곱셈이 아니라 덧셈으로 count를 해준 것이다.

예를들어 AxB 배열에 13이 3개, CxD 배열에 -13이 3개 있다고 하면

본래는 3x3으로 9개로 count하는 것이 맞는데 나는 단순히 3개, 3개를 더하여 6개로 count해버려서 12% 쯤에서 오류가 발생했다.

해당 내용만 보완해주었더니 맞출 수 있었다.

 

풀이 과정


1. 배열 4개(A, B, C, D)를 정의하고, 각 배열마다 값을 입력 받는다.
2. AxB배열, CxD배열을 정의하고, 각각 오름차순으로 정려한다.
3. 투 포인터를 사용하여 탐색하면서 count하되,
   동일한 값이 나온 경우 동일 값의 갯수만큼 곱한 갯수를 count에 추가한다.

 

소스 ▽

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main { // [Gold2] 7453번 : 합이 0인 네 정수
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        long cnt = 0;
        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(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[] mltplX = new long[N * N];
        long[] mltplY = new long[N * N];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                mltplX[N * i + j] = A[i] + B[j];
                mltplY[N * i + j] = C[i] + D[j];
            }
        }
        Arrays.sort(mltplX);
        Arrays.sort(mltplY);

        int x = 0;
        int y = N * N - 1;
        while (x < N * N && y >= 0) {
            if (mltplX[x] + mltplY[y] > 0) {
                    y--;
            } else if (mltplX[x] + mltplY[y] < 0) {
                    x++;

            } else {
                long xc=1, yc=1;
                while (true) {
                    if (x + 1 < N * N && mltplX[x] == mltplX[x + 1]) {
                        xc++;
                        x++;
                    } else {
                        break;
                    }
                }
                while (true) {
                    if (y - 1 >= 0 && mltplY[y] == mltplY[y - 1]) {
                        yc++;
                        y--;
                    } else {
                        break;
                    }
                }
                cnt+=xc*yc;
                x++;
                y--;
            }
        }

        System.out.println(cnt);
    }
}