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
가장 먼저 든 생각은 연속된 수의 합과 이에 대한 경우의 수를 구할 수 있는 배열을 만들어보자였는데, 메모리 제한이 작기 때문에 map 자료구조를 이용하기로 했다. 연속된 수의 합을 구할 때는 그냥 이중 for문으로 쉽게 구현할 수 있다.
주의해야 할 점은 답으로 제출하는 경우의 수가 int 형 범위를 넘어갈 수 있으므로 long 형 타입을 써줘야한다.
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <memory.h>
#include <map>
#define endl '\n'
#define ll long long
#define pii pair<int, int>
#define max 987654321
using namespace std;
int T, n, m;
int A[1000];
int B[1000];
map<int, ll> s;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
ll result = 0;
cin >> T >> n;
for (int i = 0; i < n; i++)
{
cin >> A[i];
}
int sum = 0;
for (int i = 0; i < n; i++)
{
sum = A[i];
s[sum]++;
for (int j = i + 1; j < n; j++)
{
sum += A[j];
s[sum]++;
}
}
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> B[i];
}
for (int i = 0; i < m; i++)
{
sum = B[i];
result += s[T - sum];
for (int j = i + 1; j < m; j++)
{
sum += B[j];
result += s[T - sum];
}
}
cout << result << endl;
return 0;
}
'코딩테스트 > C++' 카테고리의 다른 글
위상 정렬 (topology sort) (0) | 2024.03.11 |
---|---|
[백준 BOJ] 2252번 - 줄 세우기 (C++) (0) | 2024.03.11 |
[백준 BOJ] 20040번 - 사이클 게임 (C++) (0) | 2024.03.10 |
[백준 BOJ] 17404번 - RGB거리 2(C++) (0) | 2024.03.10 |
[백준 BOJ] 10942번 - 팰린드롬? (C++) (1) | 2024.02.10 |