Skip to content

Commit d93e49a

Browse files
committed
[Gold II] Title: 합이 0인 네 정수, Time: 6364 ms, Memory: 505536 KB -BaekjoonHub
1 parent 6542f9a commit d93e49a

2 files changed

Lines changed: 105 additions & 0 deletions

File tree

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+
메모리: 505536 KB, 시간: 6364 ms
8+
9+
### 분류
10+
11+
정렬, 이분 탐색, 두 포인터, 중간에서 만나기
12+
13+
### 제출 일자
14+
15+
2025년 10월 27일 18:50:31
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: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
let n = Int(readLine()!)!
2+
var answer = 0
3+
4+
var aList = [Int]()
5+
var bList = [Int]()
6+
var cList = [Int]()
7+
var dList = [Int]()
8+
9+
var abList = [Int]()
10+
var cdList = [Int]()
11+
12+
for _ in 0..<n {
13+
let abcd = readLine()!.split { $0 == " " }.map { Int($0)! }
14+
aList.append(abcd[0])
15+
bList.append(abcd[1])
16+
cList.append(abcd[2])
17+
dList.append(abcd[3])
18+
}
19+
20+
for i in 0..<n {
21+
for j in 0..<n {
22+
let sumAb = aList[i] + bList[j]
23+
let sumCd = cList[i] + dList[j]
24+
abList.append(sumAb)
25+
cdList.append(sumCd)
26+
}
27+
}
28+
29+
abList.sort { $0 < $1 }
30+
cdList.sort { $0 < $1 }
31+
32+
for ab in abList {
33+
let upperBound = upperBound(ab, cdList)
34+
let lowerBound = lowerBound(ab, cdList)
35+
36+
answer += upperBound - lowerBound
37+
}
38+
39+
print(answer)
40+
41+
func lowerBound(_ ab: Int, _ cdList: [Int]) -> Int {
42+
var start = 0
43+
var end = cdList.count
44+
45+
while start < end {
46+
let mid = (start + end) / 2
47+
let cd = cdList[mid]
48+
// 0보다 작음, 즉 덜 빼야함
49+
if ab + cd < 0 {
50+
start = mid + 1
51+
} else {
52+
end = mid
53+
}
54+
}
55+
56+
return start
57+
}
58+
59+
func upperBound(_ ab: Int, _ cd: [Int]) -> Int {
60+
var start = 0
61+
var end = cdList.count
62+
63+
while start < end {
64+
let mid = (start + end) / 2
65+
let cd = cdList[mid]
66+
// 0보다 작음, 즉 덜 빼야함
67+
if ab + cd <= 0 {
68+
start = mid + 1
69+
} else {
70+
end = mid
71+
}
72+
}
73+
74+
return start
75+
}

0 commit comments

Comments
 (0)