Skip to content

Commit

Permalink
[Gold III] Title: 두 배열의 합, Time: 120 ms, Memory: 8152 KB -BaekjoonHub
Browse files Browse the repository at this point in the history
  • Loading branch information
belowyoon committed Mar 9, 2024
1 parent 9faf9c6 commit a759958
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 0 deletions.
38 changes: 38 additions & 0 deletions 백준/Gold/2143. 두 배열의 합/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# [Gold III] 두 배열의 합 - 2143

[문제 링크](https://www.acmicpc.net/problem/2143)

### 성능 요약

메모리: 8152 KB, 시간: 120 ms

### 분류

이분 탐색, 자료 구조, 누적 합

### 제출 일자

2024년 3월 9일 14:41:31

### 문제 설명

<p>한 배열 A[1], A[2], …, A[n]에 대해서, 부 배열은 A[i], A[i+1], …, A[j-1], A[j] (단, 1 ≤ i ≤ j ≤ n)을 말한다. 이러한 부 배열의 합은 A[i]+…+A[j]를 의미한다. 각 원소가 정수인 두 배열 A[1], …, A[n]과 B[1], …, B[m]이 주어졌을 때, A의 부 배열의 합에 B의 부 배열의 합을 더해서 T가 되는 모든 부 배열 쌍의 개수를 구하는 프로그램을 작성하시오.</p>

<p>예를 들어 A = {1, 3, 1, 2}, B = {1, 3, 2}, T=5인 경우, 부 배열 쌍의 개수는 다음의 7가지 경우가 있다.</p>

<pre>T(=5) = A[1] + B[1] + B[2]
= A[1] + A[2] + B[1]
= A[2] + B[3]
= A[2] + A[3] + B[1]
= A[3] + B[1] + B[2]
= A[3] + A[4] + B[3]
= A[4] + B[2] </pre>

### 입력

<p>첫째 줄에 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)이 주어지고, 그 다음 줄에 m개의 정수로 B[1], …, B[m]이 주어진다. 각각의 배열 원소는 절댓값이 1,000,000을 넘지 않는 정수이다.</p>

### 출력

<p>첫째 줄에 답을 출력한다. 가능한 경우가 한 가지도 없을 경우에는 0을 출력한다.</p>

49 changes: 49 additions & 0 deletions 백준/Gold/2143. 두 배열의 합/두 배열의 합.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
using namespace std;

int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
//freopen("input.txt", "r", stdin);
int t, n, m;

cin >> t >> n;
vector<int> a(n,0);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
cin >> m;
vector<int> b(m,0);
for (int i = 0; i < m; i++) {
cin >> b[i];
}

for(int i = 0; i < n; i++) {
int s = a[i];
for (int j = i + 1; j < n; j++) {
s += a[j];
a.push_back(s);
}
}
for(int i = 0; i < m; i++) {
int s = b[i];
for (int j = i + 1; j < m; j++) {
s += b[j];
b.push_back(s);
}
}

long long res = 0;
sort(b.begin(), b.end());
for(int i = 0; i < a.size(); i++){
int idx = lower_bound(b.begin(),b.end(),t - a[i]) - b.begin();
int endIdx = upper_bound(b.begin(),b.end(),t - a[i]) - b.begin();
res += endIdx - idx;
}
cout << res;
return 0;
}

0 comments on commit a759958

Please sign in to comment.