문제
정수로 이루어진 크기가 같은 배열 A, B, C, D가 있다.
A[a], B[b], C[c], D[d]의 합이 0인 (a, b, c, d) 쌍의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 배열의 크기 n (1 ≤ n ≤ 4000)이 주어진다. 다음 n개 줄에는 A, B, C, D에 포함되는 정수가 공백으로 구분되어져서 주어진다. 배열에 들어있는 정수의 절댓값은 최대 228이다.
출력
합이 0이 되는 쌍의 개수를 출력한다.
접근 방식
은근 투 포인터 문제에 map 자료구조를 사용하는 풀이가 많이 있는 것 같다
해당 문제는 AB의 합을 unordered_map에 저장(map에 저장하면 매번 sort가 일어나기 때문에 시간초과 발생)
하고 C,D 배열을 돌면서 해당하는 값이 존재하는지 확인만 하면 된다!
코드
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int n; cin >> n;
vector<int> A(n), B(n), C(n), D(n);
for(int i = 0; i < n; i++) {
cin >> A[i] >> B[i] >> C[i] >> D[i];
}
unordered_map<int, int> ABsums;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
ABsums[A[i] + B[j]]++;
}
}
long long ans = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
int sumCD = C[i] + D[j];
if(ABsums.find(-sumCD) != ABsums.end()) {
ans += ABsums[-sumCD];
}
}
}
cout << ans;
return 0;
}
'Algorithm' 카테고리의 다른 글
[BOJ] N번째 큰 수 2075번 C++ (1) | 2024.04.12 |
---|---|
[BOJ] 선분 위의 점 11663번 C++ (0) | 2024.04.11 |
[BOJ] 마법사 상어와 토네이도 20057번 C++ (0) | 2024.04.08 |
[BOJ] 부분합 1806번 C++ (1) | 2024.04.06 |
[BOJ] 회전 초밥 15961번 C++ (2) | 2024.04.06 |