Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

코드와이

[BAEKJOON] 2143. 두 배열의 합 본문

acmicpc

[BAEKJOON] 2143. 두 배열의 합

코드와이 2021. 12. 18. 17:42

 

투 포인터 

 

문제링크

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

 

각 배열의 부분합을 구하고 그 모든 값들을 List에 저장하고 정렬한다.

투 포인터로 한 리스트는 처음부터 다른 리스트는 뒤에서부터 두 값들의 합을 'T'와 비교한다.

package acmicpc.Gold3;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class 두_배열의_합 {

	static int t, n, arr[], m, arr2[];
	static long ans;
	static List<Integer> list, list2;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		t = Integer.parseInt(br.readLine());
		
		n = Integer.parseInt(br.readLine());
		arr = new int[n];
		st = new StringTokenizer(br.readLine());
		for(int i = 0 ; i < n ; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		m = Integer.parseInt(br.readLine());
		arr2 = new int[m];
		st = new StringTokenizer(br.readLine());
		for(int i = 0 ; i < m ; i++) {
			arr2[i] = Integer.parseInt(st.nextToken());
		}
		
		list = new ArrayList<>();
		list2 = new ArrayList<>();
		
		for(int i = 0 ; i < n ; i++) {
			int sum = 0;
			for(int j = i ; j < n ; j++) {
				sum += arr[j];
				list.add(sum);
			}
		}
		
		for(int i = 0 ; i < m ; i++) {
			int sum = 0;
			for(int j = i ; j < m ; j++) {
				sum += arr2[j];
				list2.add(sum);
			}
		}
		
		Collections.sort(list);
		Collections.sort(list2);
		
		ans = 0;
		
		search();
		
		System.out.println(ans);
		
	}
	
	public static void search() {
		
		int idx = 0;
		int idx2 = list2.size() - 1;
		
		while(idx < list.size() && idx2 >= 0) {

			long sum = list.get(idx) + list2.get(idx2);
			
			if(sum == t) {
				
				long cnt1 = 0;
				long cnt2 = 0;
				int a = list.get(idx);
				int b = list2.get(idx2);
				
				while(idx < list.size() && list.get(idx) == a) {
					cnt1++;
					idx++;
				}
				
				while(idx2 >= 0 && list2.get(idx2) == b) {
					cnt2++;
					idx2--;
				}
				
				ans += cnt1 * cnt2;
				
			} else if(sum < t) {
				idx++;
			} else {
				idx2--;
			}
			
		}
		
	}
}
 

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

 

'acmicpc' 카테고리의 다른 글

[BAEKJOON] 2533.사회망 서비스  (0) 2021.12.11
[BAEKJOON] 11779. 최소비용구하기2  (0) 2021.12.10
[BAEKJOON] 16637. 괄호 추가하기  (0) 2021.12.06
[BAEKJOON] 11437. LCA  (0) 2021.12.01
[BAEKJOON] 2437. 저울  (0) 2021.11.23