๐Ÿ‘Š PS/Algorithm

[Baekjoon] 2143๋ฒˆ: ๋‘ ๋ฐฐ์—ด์˜ ํ•ฉ

hades1 2024. 9. 20. 22:49

๐Ÿฅ… ๋ฌธ์ œ

https://www.acmicpc.net/problem/2143

 

๐Ÿ” ์„ค๊ณ„

๋ถ€๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋ฅผ ๋ณด๋ฉด, ๋ˆ„์  ํ•ฉ์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์ฒ˜์Œ์—๋Š” A์™€ B์˜ ๋ถ€๋ฐฐ์—ด์„ ๊ตฌํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋งต์— ์ €์žฅํ•œ ํ›„, ํ•œ ์ชฝ์—์„œ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ˜๋ณตํ•˜๋ฉด์„œ, (T - ํ•œ ์ชฝ์— ์žˆ๋Š” ๋ถ€๋ฐฐ์—ด์˜ ํ•ฉ)์ด ๋‹ค๋ฅธ ์ชฝ์— ์žˆ์œผ๋ฉด, (ํ•œ ์ชฝ์— ์žˆ๋Š” ๋ถ€๋ฐฐ์—ด์˜ ํ•ฉ์˜ ๊ฐœ์ˆ˜) * (๋‹ค๋ฅธ ์ชฝ์— ์žˆ๋Š” ๋ถ€๋ฐฐ์—ด์˜ ํ•ฉ์˜ ๊ฐœ์ˆ˜)๋กœ ๊ตฌํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. ๋งต ํ•˜๋‚˜๊ฐ€ ์ตœ๋Œ€ 1000000๊ฐœ * 2 * 4Bytes ์ด๋ฏ€๋กœ 64MB๋ฅผ ์ดˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ, ๋งต์„ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค๊ณ , ๋‹ค๋ฅธ ์ชฝ์—์„œ ๋ถ€๋ฐฐ์—ด์˜ ํ•ฉ์„ ๋งŒ๋“ค๋ฉด์„œ ๋ฐ”๋กœ ์ฐพ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๋ถ€๋ฐฐ์—ด์˜ ํ•ฉ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1000000, ํ•œ ์ชฝ์—์„œ T - (๋งŒ๋“  ๋ถ€๋ฐฐ์—ด์˜ ํ•ฉ)์„ ์ฐพ๊ธฐ ์œ„ํ•ด log1000 ์ด๋ฏ€๋กœ 10^7์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.


 

 

์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํ•œ ์ชฝ์—์„œ ๋ถ€๋ฐฐ์—ด์˜ ํ•ฉ์„ ๋งŒ๋“ค๊ณ , ๋‹ค๋ฅธ ์ชฝ์— T - ๋ถ€๋ฐฐ์—ด์˜ ํ•ฉ์ด ๋ช‡ ๊ฐœ๊ฐ€ ์žˆ๋Š”์ง€ ๊ตฌํ•ด์„œ ๊ฒฐ๊ณผ์— ๋”ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ ๊ฐœ์ˆ˜๋Š” lower_bound์™€ upper_bound๋ฅผ ์ด์šฉํ•˜์—ฌ ์œ„ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

upper_bound๋Š” key๋ณด๋‹ค ํฐ ์ตœ์ดˆ์˜ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , lower_bound๋Š” key๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์ตœ์ดˆ์˜ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. upper_bound - lower_bound๋Š” ๋ฐฐ์—ด์—์„œ key์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ด์šฉํ•œ๋‹ค.

 

๐Ÿ‘Š ํ’€์ด

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int t, n, m;
vector<int> a(1000);
vector<int> aSum(1000);
vector<int> b(1000);
vector<int> bSum(1000);
map<int, int> aMap;
long long result = 0;

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> t;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
		if (i > 0) {
			aSum[i] = a[i] + aSum[i - 1];
		}
		else {
			aSum[i] = a[i];
		}
	}
	cin >> m;
	for (int i = 0; i < m; i++) {
		cin >> b[i];
		if (i > 0) {
			bSum[i] = b[i] + bSum[i - 1];
		}
		else {
			bSum[i] = b[i];
		}
	}

	for (int i = 0; i < n; i++) {
		if (aMap.find(aSum[i]) != aMap.end()) {
			aMap[aSum[i]] += 1;
		}
		else {
			aMap.insert({ aSum[i] , 1 });
		}

		for (int j = 0; j < i; j++) {
			long long part_sum = aSum[i] - aSum[j];
			if (aMap.find(aSum[i] - aSum[j]) != aMap.end()) {
				aMap[part_sum] += 1;
			}
			else {
				aMap.insert({ part_sum, 1 });
			}
		}
	}

	for (int i = 0; i < m; i++) {
		if (aMap.find(t - bSum[i]) != aMap.end()) {
			result += aMap[t - bSum[i]];
		}
		for (int j = 0; j < i; j++) {
			long long part_sum = bSum[i] - bSum[j];
			if (aMap.find(t - part_sum) != aMap.end()) {
				result += aMap[t - part_sum];
			}
		}
	}

	cout << result << "\n";

	return 0;
}

 

 

๐Ÿ‘Š ํ’€์ด2

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int t, n, m, part_sum;
vector<int> a(1000);
vector<int> aSum(1000);
vector<int> b(1000);
vector<int> bSum(1000);
vector<int> partSumA;
long long result = 0;

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> t;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
		if (i > 0) {
			aSum[i] = a[i] + aSum[i - 1];
		}
		else {
			aSum[i] = a[i];
		}
	}
	cin >> m;
	for (int i = 0; i < m; i++) {
		cin >> b[i];
		if (i > 0) {
			bSum[i] = b[i] + bSum[i - 1];
		}
		else {
			bSum[i] = b[i];
		}
	}

	for (int i = 0; i < n; i++) {
		partSumA.push_back(aSum[i]);
		for (int j = 0; j < i; j++) {
			partSumA.push_back(aSum[i] - aSum[j]);
		}
	}

	sort(partSumA.begin(), partSumA.end());

	for (int i = 0; i < m; i++) {
		result += upper_bound(partSumA.begin(), partSumA.end(), t - bSum[i]) -lower_bound(partSumA.begin(), partSumA.end(), t - bSum[i]);
		for (int j = 0; j < i; j++) {
			part_sum = bSum[i] - bSum[j];
			result += upper_bound(partSumA.begin(), partSumA.end(), t - part_sum) - lower_bound(partSumA.begin(), partSumA.end(), t - part_sum);
		}
	}

	cout << result << "\n";

	return 0;
}

 

๐Ÿ“ ๋ฉ”๋ชจ

์ฒซ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์–ด๋Š ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ๋ถ€๋ถ„ํ•ฉ์„ ๋„ฃ๋Š” ๊ณผ์ •์—์„œ ๊ทธ ๊ฐ’์ด ์ด๋ฏธ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.