백준알고리즘

합이 0인 네 정수

먼지의삶 2019. 8. 31. 11:14

음.. 문제보면서 가장간단하게 푸는방법은 아무래도 그냥 4중포문 돌리는게 제일 쉽겠지만,

배열의 크기가 4000에, 이걸 4승한다면... 시간제한 2초는 당연히 날거같아서, 그냥 2중포문 + 2중포문으로 나눠서 하는게 좋겠다고 생각이들었다.

 

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<utility>

using namespace std;

int main() {
	int n;
	scanf("%d", &n);
	vector<int> a(n);
	vector<int> b(n);
	vector<int> c(n);
	vector<int> d(n);
	for (int i = 0; i < n; i++) {
		scanf("%d %d %d %d", &a[i], &b[i], &c[i], &d[i]);
	}
	vector<int> first, second;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			first.push_back(a[i] + b[j]);
			second.push_back((c[i] + d[j]));
		}
	}
	sort(second.begin(), second.end());
	long long ans = 0;
	for (int num : first) {
		auto range = equal_range(second.begin(), second.end(), -num);
		ans += range.second - range.first;
	}

	printf("%lld\n", ans);
	return 0;
}

 

다음과 같이 나눠서풀었는데, 배열 대신 벡터를 사용한이유는 Sorting함수와 range를 사용하기 위해서 사용했다,.

range.second - range.first 를 통해 계속해서 합계산해서 검사를해보는과정 또한 벡터일때 쓰기 편해서 사용했다.

처음에 long long 말고 int 썼을때 틀렸는데, 아무래도 4000가지 의 값들을 다 더하고 일일이 검사하는 과정중

 int 를 초과하는게 아닌가 싶어서 long long으로 데이터 타입을 변경하고나서 정답을 확인했다.