diff --git a/kangrae-jo/Prefix Sum/10-kangrae-jo.cpp b/kangrae-jo/PrefixSum/10-kangrae-jo.cpp similarity index 100% rename from kangrae-jo/Prefix Sum/10-kangrae-jo.cpp rename to kangrae-jo/PrefixSum/10-kangrae-jo.cpp diff --git a/kangrae-jo/Prefix Sum/22-kangrae-jo.cpp b/kangrae-jo/PrefixSum/22-kangrae-jo.cpp similarity index 100% rename from kangrae-jo/Prefix Sum/22-kangrae-jo.cpp rename to kangrae-jo/PrefixSum/22-kangrae-jo.cpp diff --git a/kangrae-jo/PrefixSum/31-kangrae-jo.cpp b/kangrae-jo/PrefixSum/31-kangrae-jo.cpp new file mode 100644 index 0000000..9dc85e0 --- /dev/null +++ b/kangrae-jo/PrefixSum/31-kangrae-jo.cpp @@ -0,0 +1,73 @@ +#include +#include +#include + +using namespace std; + +int T, N, M; +vector A, B; + +void input(int& n, vector& v) { + cin >> n; + v.assign(n, 0); + for (int i = 0; i < n; i++) { + cin >> v[i]; + } +} + +vector makeSub(int n, vector v) { + vector sub; + for (int i = 0; i < n; i++) { + int sum = 0; + for (int j = i; j < n; j++) { + sum += v[j]; + sub.push_back(sum); + } + } + return sub; +} + +int main() { + ios_base::sync_with_stdio(0); + cin.tie(0); + + // 0) input + cin >> T; + input(N, A); + input(M, B); + + // 1) A, B 모든 부분합 + vector subA = makeSub(N, A); + vector subB = makeSub(M, B); + + // 2) 정렬 + sort(subA.begin(), subA.end()); + sort(subB.begin(), subB.end()); + + // 3) 투포인터로 합이 T인 쌍 세기 + long long answer = 0; + int left = 0, right = subB.size() - 1; + while (left < subA.size() && 0 <= right) { + int sum = subA[left] + subB[right]; + if (sum == T) { + long long countA = 1, countB = 1; + while (left + 1 < subA.size() && subA[left] == subA[left + 1]) { + countA++; + left++; + } + while (right - 1 >= 0 && subB[right] == subB[right - 1]) { + countB++; + right--; + } + answer += countA * countB; + left++; + right--; + } + else if (sum < T) left++; + else right--; + } + + cout << answer << '\n'; + + return 0; +} \ No newline at end of file diff --git a/kangrae-jo/README.md b/kangrae-jo/README.md index f72b626..d9a3e9c 100644 --- a/kangrae-jo/README.md +++ b/kangrae-jo/README.md @@ -31,4 +31,5 @@ | 27차시 | 2024.06.01 | DFS | [개미굴](https://www.acmicpc.net/problem/14725)|[#107](https://github.com/AlgoLeadMe/AlgoLeadMe-12/pull/107)| | 28차시 | 2024.06.10 | BFS | [경주로 건설](https://school.programmers.co.kr/learn/courses/30/lessons/67259)|[#110](https://github.com/AlgoLeadMe/AlgoLeadMe-12/pull/110)| | 29차시 | 2024.06.19 | TRIE | [[3차] 자동완성](https://school.programmers.co.kr/learn/courses/30/lessons/17685)|[#114](https://github.com/AlgoLeadMe/AlgoLeadMe-12/pull/114)| -| 30차시 | 2024.07.18 | BFS | [치즈](https://www.acmicpc.net/problem/2638)|[#117](https://github.com/AlgoLeadMe/AlgoLeadMe-12/pull/117)| \ No newline at end of file +| 30차시 | 2024.07.18 | BFS | [치즈](https://www.acmicpc.net/problem/2638)|[#117](https://github.com/AlgoLeadMe/AlgoLeadMe-12/pull/117)| +| 31차시 | 2024.07.31 | Prefix Sum | [두 배열의 합](https://www.acmicpc.net/problem/2143)|[#122](https://github.com/AlgoLeadMe/AlgoLeadMe-12/pull/122)| \ No newline at end of file