BOJ_2143_두 배열의 합
2023. 2. 2. 17:21ㆍAlgorithm/BOJ
728x90
https://www.acmicpc.net/problem/2143
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 |