Skip to content

Commit 7e56327

Browse files
committed
[Gold II] Title: 합이 0인 네 정수, Time: 3116 ms, Memory: 166156 KB -BaekjoonHub
1 parent 94d443d commit 7e56327

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# [Gold II] 합이 0인 네 정수 - 7453
2+
3+
[문제 링크](https://www.acmicpc.net/problem/7453)
4+
5+
### 성능 요약
6+
7+
메모리: 166156 KB, 시간: 3116 ms
8+
9+
### 분류
10+
11+
이분 탐색, 중간에서 만나기, 정렬, 두 포인터
12+
13+
### 제출 일자
14+
15+
2024년 11월 19일 21:43:02
16+
17+
### 문제 설명
18+
19+
<p>정수로 이루어진 크기가 같은 배열 A, B, C, D가 있다.</p>
20+
21+
<p>A[a], B[b], C[c], D[d]의 합이 0인 (a, b, c, d) 쌍의 개수를 구하는 프로그램을 작성하시오.</p>
22+
23+
### 입력
24+
25+
<p>첫째 줄에 배열의 크기 n (1 ≤ n ≤ 4000)이 주어진다. 다음 n개 줄에는 A, B, C, D에 포함되는 정수가 공백으로 구분되어져서 주어진다. 배열에 들어있는 정수의 절댓값은 최대 2<sup>28</sup>이다.</p>
26+
27+
### 출력
28+
29+
<p>합이 0이 되는 쌍의 개수를 출력한다.</p>
30+
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
7+
int main() {
8+
std::ostream::sync_with_stdio(false);
9+
10+
int N;
11+
cin >> N;
12+
13+
vector<int> aV, bV, cV, dV;
14+
for (int i = 0; i < N; i++) {
15+
int a, b, c, d;
16+
cin >> a >> b >> c >> d;
17+
aV.push_back(a);
18+
bV.push_back(b);
19+
cV.push_back(c);
20+
dV.push_back(d);
21+
}
22+
23+
vector<int> abV, cdV;
24+
for (int i = 0; i < N; i++) {
25+
for (int j = 0; j < N; j++) {
26+
abV.push_back(aV[i] + bV[j]);
27+
cdV.push_back(cV[i] + dV[j]);
28+
}
29+
}
30+
31+
sort(abV.begin(), abV.end());
32+
sort(cdV.begin(), cdV.end(), greater<>());
33+
34+
long long answer = 0;
35+
long long size = N * N;
36+
int left = 0, right = 0;
37+
while (left < size && right < size) {
38+
if (abV[left] + cdV[right] == 0) {
39+
long long leftCnt = 1, rightCnt = 1;
40+
left++, right++;
41+
42+
while (left < size && abV[left - 1] == abV[left]) {
43+
left++;
44+
leftCnt++;
45+
}
46+
47+
while (right < size && cdV[right - 1] == cdV[right]) {
48+
right++;
49+
rightCnt++;
50+
}
51+
52+
answer += leftCnt * rightCnt;
53+
} else if (abV[left] + cdV[right] < 0) {
54+
left++;
55+
} else {
56+
right++;
57+
}
58+
}
59+
60+
cout << answer;
61+
62+
return 0;
63+
}

0 commit comments

Comments
 (0)