250517 두 배열의 합

Jongleee·2025년 5월 17일
0

TIL

목록 보기
901/970
public static void main(String[] args) throws IOException {
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	int target = Integer.parseInt(br.readLine());
	int n = Integer.parseInt(br.readLine());
	int[] prefixA = getPrefixSumArray(br, n);

	int m = Integer.parseInt(br.readLine());
	int[] prefixB = getPrefixSumArray(br, m);

	Map<Integer, Integer> sumCountMap = buildSubArraySumCount(prefixB, m);

	long result = countMatchingSubArrays(prefixA, n, sumCountMap, target);
	System.out.println(result);
}

private static int[] getPrefixSumArray(BufferedReader br, int size) throws IOException {
	int[] prefixSum = new int[size + 1];
	StringTokenizer st = new StringTokenizer(br.readLine());
	for (int i = 1; i <= size; i++) {
		int value = Integer.parseInt(st.nextToken());
		prefixSum[i] = prefixSum[i - 1] + value;
	}
	return prefixSum;
}

private static Map<Integer, Integer> buildSubArraySumCount(int[] prefix, int length) {
	Map<Integer, Integer> countMap = new HashMap<>(1000000);
	for (int i = length; i > 0; i--) {
		for (int j = i - 1; j >= 0; j--) {
			int sum = prefix[i] - prefix[j];
			countMap.put(sum, countMap.getOrDefault(sum, 0) + 1);
		}
	}
	return countMap;
}

private static long countMatchingSubArrays(int[] prefix, int length, Map<Integer, Integer> countMap, int target) {
	long totalCount = 0;
	for (int i = length; i > 0; i--) {
		for (int j = i - 1; j >= 0; j--) {
			int sum = prefix[i] - prefix[j];
			int complement = target - sum;
			totalCount += countMap.getOrDefault(complement, 0);
		}
	}
	return totalCount;
}

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

0개의 댓글