BOJ_2143_두 배열의 합

2023. 2. 2. 17:21Algorithm/BOJ

728x90

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

 

2143번: 두 배열의 합

첫째 줄에 T(-1,000,000,000 ≤ T ≤ 1,000,000,000)가 주어진다. 다음 줄에는 n(1 ≤ n ≤ 1,000)이 주어지고, 그 다음 줄에 n개의 정수로 A[1], …, A[n]이 주어진다. 다음 줄에는 m(1 ≤ m ≤ 1,000)이 주어지고, 그

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 백준 2143번 두 배열의 합
 골드 3
 */
public class BOJ_2143_두배열의합 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int T = Integer.parseInt(br.readLine());
        int n = Integer.parseInt(br.readLine());
        int[] A = new int[n+1];
        st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= n; i++){
            A[i] = Integer.parseInt(st.nextToken());
        }

        int m = Integer.parseInt(br.readLine());
        int[] B = new int[m+1];
        st = new StringTokenizer(br.readLine());

        for (int i = 1; i <= m; i++){
            B[i] = Integer.parseInt(st.nextToken());
        }

        List<Integer> aSums = calList(A, n);
        List<Integer> bSums = calList(B, m);

        System.out.println(solution(aSums, bSums, T));
    }

    public static List<Integer> calList(int[] arr, int size){ // 부분 합 구하기
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i<size; i++){
            for (int j = i; j<size; j++){
                if(i == j) list.add(arr[j+1]);
                else list.add(list.get(list.size()-1) + arr[j+1]);
            }
        }
        Collections.sort(list); // 오름차순 정렬
        return list;
    }

    public static long solution(List<Integer> l1, List<Integer> l2, int T){
        int p1 = 0, p2 = l2.size()-1;
        long cnt = 0;

        while (p1 < l1.size() && p2 >= 0){
            int sum = l1.get(p1) + l2.get(p2);
            if (sum == T){ // T값인 경우
                int vA = l1.get(p1);
                int vB = l2.get(p2);
                long cntA = 0, cntB = 0;

                // 리스트에서 중복 되는 값 개수 찾기
                while (p1 < l1.size() && l1.get(p1) == vA){
                    cntA++;
                    p1++;
                }
                while (p2 >= 0 && l2.get(p2) == vB){
                    cntB++;
                    p2--;
                }
                cnt += cntA * cntB; // 해당 값들에서 가능한 개수
            }else if(sum < T){  // 작은 경우 p1 증가
                p1++;
            }else if(sum > T){ // 큰 경우 p2 증가
                p2--;
            }
        }
        return cnt;
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

BOJ_1005_ACM Craft_java  (0) 2023.02.05
BOJ_2252_줄 세우기_java  (0) 2023.02.05
BOJ_20040_사이클게임_java  (0) 2023.01.30
BOJ_17404_RGB거리 2_java  (0) 2023.01.24
BOJ_10942_팰린드롬?_java  (0) 2023.01.24