728x90
해결과정 - 해시맵, 누적합
문제를 보았을때 각각의 수가 나오는 경우의 수를 배열로 저장하면 되겠다고 생각하였지만 100억만큼의 배열이 요구되었으므로 해쉬가 필요하다고 생각하였다. 직접 구현하는 것도 좋지만 unordered_map을 사용하면 간단하게 구현할 수 있다.
그리고 순차적인 합이 부 배열이라는 문구를 본뒤 본능적으로 누적합으로 캐싱이 필요한 문제인지 생각해보았는데 역시 필요하여 누적합과 unordered_map을 통해 문제를 해결할 수 있었다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <unordered_map>
#define FAST ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
typedef long long ll;
using namespace std;
ll T;
ll n, m;
vector<int> a, b;
unordered_map<ll, ll> a_dp;
unordered_map<ll, ll> b_dp;
int main() {
FAST;
cin >> T >> n;
a.resize(n + 1);
for (int i = 1; i <= n; i++) {
ll x;
cin >> x;
a[i] = a[i - 1] + x;
}
cin >> m;
b.resize(m + 1);
for (int i = 1; i <= m; i++) {
ll x;
cin >> x;
b[i] = b[i - 1] + x;
}
// i ~ j 까지는 a[j] - a[i - 1]
for (int i = 0; i < n ; i++) {
for (int j = 1; j <= n - i; j++) {
ll value = a[j + i] - a[j - 1];
a_dp[value]++;
}
}
for (int i = 0; i < m; i++) {
for (int j = 1; j <= m - i; j++) {
ll value = b[j + i] - b[j - 1];
b_dp[value]++;
}
}
ll result = 0;
for (auto it : a_dp) {
ll cacl = T - it.first;
if (b_dp[cacl] > 0) {
result += it.second * b_dp[cacl];
}
}
cout << result << "\n";
return 0;
}
728x90
'알고리즘문제 풀어보기 > 백준' 카테고리의 다른 글
백준 - 1644 소수의 연속합 (0) | 2024.10.18 |
---|---|
백준 - 17387 선분교차2 (0) | 2024.10.12 |
백준 - 9466 텀 프로젝트 (0) | 2024.10.10 |
백준 - 1005 ACM Craft (0) | 2024.10.09 |
백준 - 19042 팰린드롬 (0) | 2024.10.09 |