백준 2143번 두 배열의 합
< 백준 2143번 두 배열의 합 - 마포 코딩박 >
사용한 알고리즘: map
임의의 수 T 와 두 배열 A, B 가 주어졌을 때 A 와 B 의 부배열의 합으로 T 를 만들 수 있는 경우의 수를 구하는 문제였습니다.
풀이는 다음과 같습니다.
(1) (코드 17~24)
A 의 모든 부배열로 만들 수 있는 값을 map에 저장합니다.
예를들어 A[1]~A[3] , A[2]~A[7] 의 두 부배열이 10 이라는 값을 만들면 map[10]=2 입니다.
(2) (코드 25~33)
T - ( B 의 모든 부배열로 만들 수 있는 값 ) 의 모든 경우를 보며, 이 값을 만들 수 있는 A의 부배열의 개수 ( 과정 (1) 에서 구해놓음 ) 가 답이 됩니다.
사용한 알고리즘: map
임의의 수 T 와 두 배열 A, B 가 주어졌을 때 A 와 B 의 부배열의 합으로 T 를 만들 수 있는 경우의 수를 구하는 문제였습니다.
풀이는 다음과 같습니다.
(1) (코드 17~24)
A 의 모든 부배열로 만들 수 있는 값을 map에 저장합니다.
예를들어 A[1]~A[3] , A[2]~A[7] 의 두 부배열이 10 이라는 값을 만들면 map[10]=2 입니다.
(2) (코드 25~33)
T - ( B 의 모든 부배열로 만들 수 있는 값 ) 의 모든 경우를 보며, 이 값을 만들 수 있는 A의 부배열의 개수 ( 과정 (1) 에서 구해놓음 ) 가 답이 됩니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
using namespace std; | |
const int MAX = 1002; | |
const int INF = 1000000000; | |
typedef long long ll; | |
ll T, N, M, A[MAX], B[MAX] ,ans; | |
map<ll, ll> Sum; | |
int main(){ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL); | |
cin >> T; | |
cin >> N; | |
for (ll i = 0; i < N; ++i) cin >> A[i]; | |
cin >> M; | |
for (ll i = 0; i < M; ++i) cin >> B[i]; | |
// A의 모든 부배열의 합 Sum 에 저장 | |
for (ll i = 0; i < N; ++i){ | |
ll temp = 0; | |
for (ll j = i; j < N; ++j){ | |
temp+=A[j]; | |
if(abs(temp)<=INF) Sum[temp]++; | |
} | |
} | |
// T - B 의 모든 부배열 = Sum 값 이면 ans | |
for (ll i = 0; i < M; ++i){ | |
ll temp = T; | |
for (ll j = i; j < M; ++j){ | |
temp -= B[j]; | |
if(abs(temp)>INF) break; | |
ans += Sum[temp]; | |
} | |
} | |
cout << ans << '\n'; | |
return 0; | |
} |
댓글
댓글 쓰기
긴 글 읽어주셔서 감사합니다.
궁금한게 있으시다면 댓글 달아주세요!