반응형

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

 

이전 포스팅에서 설명한 투포인터를 활용하여 해결한 문제였습니다.

A, B 배열에 모든 부 배열 합을 구해준 뒤, 모든 경우의 수를 구해줬습니다.

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int t, n, m, a[1000], b[1000];
long long int ans = 0, c1, c2;
vector<int> A, B;
int main() {
    scanf("%d", &t);
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    scanf("%d", &m);
    for (int i = 0; i < m; i++) scanf("%d", &b[i]);

    for (int i = 0; i < n; i++) {
        int c = 0;
        for (int j = i; j < n; j++) {
            c += a[j];
            A.push_back(c);
        }
    }

    for (int i = 0; i < m; i++) {
        int c = 0;
        for (int j = i; j < m; j++) {
            c += b[j];
            B.push_back(c);
        }
    }
    
    sort(A.begin(), A.end());
    sort(B.begin(), B.end());

    for (int l = 0, r = B.size() - 1; l < A.size() && r >= 0;) {
        if (A[l] + B[r] < t) l++;
        else if (A[l] + B[r] > t) r--;
        else {
            c1 = c2 = 0;
            for (int tmp = A[l]; l < A.size() && tmp == A[l]; l++, c1++);
            for (int tmp = B[r]; r >= 0 && tmp == B[r]; r--, c2++);
            ans += c1 * c2;
        }
    }

    printf("%lld", ans);
}
반응형

'Algorithm' 카테고리의 다른 글

백준 15644 : 구슬 탈출 3  (0) 2021.11.12
백준 13460 : 구슬 탈출 2  (0) 2021.11.12
백준 1208 : 부분수열의 합 2  (0) 2021.11.12
백준 1806 : 부분합  (0) 2021.11.12
백준 2003 : 수들의 합 2  (0) 2021.11.12

+ Recent posts