어흥

[백준 2143] 두 배열의 합 (C++) 본문

알고리즘/백준

[백준 2143] 두 배열의 합 (C++)

라이언납시오 2020. 9. 8. 21:34
728x90
반응형

문제 링크: 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

1. 주의할 점

- 메모리 제한이 작다. 메모리를 최대한 적게 쓰도록 한다

- Map을 1개 사용하고, 이분탐색을 통해 답을 유추한다

 

2. 구현

- A배열과 B배열을 입력받은 후, A배열에서 만들 수 있는 부분 배열을 Ma Map에 저장한다(숫자, 해당 숫자를 만들 수 있는 개수)

- B배열의 부분 배열을 구할 때마다 Map에 (T - B의 부분배열 합) 값이 있는지 확인한다. 있다면 Map의 2번째 인자(해당 숫자를 만들 수 있는 개수)만큼 더한다

- Cal() 함수에서 위의 과정들을 다 해서 다소 복잡해 보일 수 있다

 

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
map<long long, long long> ma;
int arr[2][1000];
long long target, result = 0, diff;
int na, nb, val;

void cal(int num) {
	int len = (num == 0) ? na : nb;
	int sum = arr[num][0];
	map<long long, long long> m;
	vector<long long > v, dup;
	map<long long, long long> ::iterator it;
	for (int i = 0; i < len; i++) {
		val = arr[num][i];
		if (num == 0) {
			if (m.find(val) == m.end()) 
				m[val] = 1;			
			else 
				m[val] += 1;			
		}
		else {
			diff = target - val;
			it = ma.find(diff);
			if (it != ma.end()) 
				result += (it->second);			
		}
		v.push_back(val);
	}
	for (int t = 1; t <= len; t++) {
		for (int i = t; i < len; i++) {
			val = arr[num][i] + v[i - t];
			if (num == 0) {
				if (m.find(val) == m.end())
					m[val] = 1;
				else
					m[val] += 1;
			}
			else {
				diff = target - val;
				it = ma.find(diff);
				if (it != ma.end())
					result += (it->second);
			}
			dup.push_back(val);
		}
		v = dup;
		dup.clear();
	}
	if (num == 0) ma = m;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin >> target >> na;
	for (int i = 0; i < na; i++)
		cin >> arr[0][i];
	cin >> nb;
	for (int i = 0; i < nb; i++)
		cin >> arr[1][i];
	cal(0);
	cal(1);
	cout << result;
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 4358] 생태학 (C++)  (2) 2020.09.19
[백준 16947] 서울 지하철 2호선 (C++)  (0) 2020.09.15
[백준 13422] 도둑 (C++)  (0) 2020.09.08
[백준 14391] 종이 조각 (C++)  (0) 2020.09.05
[백준 16971] 배열 B의 값 (C++)  (0) 2020.09.02
Comments