https://www.acmicpc.net/problem/2143
2143번: 두 배열의 합
첫째 줄에 T(-1,000,000,000 ≤ T ≤ 1,000,000,000)가 주어진다. 다음 줄에는 n(1 ≤ n ≤ 1,000)이 주어지고, 그 다음 줄에 n개의 정수로 A[1], …, A[n]이 주어진다. 다음 줄에는 m(1 ≤ m ≤ 1,000)이 주어지고, 그
www.acmicpc.net
누적합과 이분 탐색을 통해 접근하였다.
풀이
두 배열의 누적합을 통해 부 배열을 생성, 두 개의 부 배열 중 하나의 부 배열을 오름차순 정렬한 뒤 이분 탐색을 수행, (T - 다른 부배열의 원소) 값을 찾아낸다면 해당 값의 개수만큼 정답을 추가하여 마지막에 출력하면 된다.
정답 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
let T = Int(readLine()!)! | |
var n = Int(readLine()!)! | |
var a = [0] | |
for number in readLine()!.split(separator: " ").map({Int($0)!}){ | |
a.append(a.last!+number) | |
} | |
var m = Int(readLine()!)! | |
var b = [0] | |
for number in readLine()!.split(separator: " ").map({Int($0)!}){ | |
b.append(b.last!+number) | |
} | |
var tempA = [Int]() | |
var tempB = [Int:Int]() | |
for i in 0..<n{ | |
for k in i+1..<n+1{ | |
tempA.append(a[k]-a[i]) | |
} | |
} | |
for i in 0..<m{ | |
for k in i+1..<m+1{ | |
let num = b[k]-b[i] | |
if tempB[num] == nil{ | |
tempB[num] = 1 | |
}else{ | |
tempB[num]! += 1 | |
} | |
} | |
} | |
let numbers = tempB.sorted(by: { $0.key < $1.key}) | |
var ans = 0 | |
for i in 0..<tempA.count{ | |
var lead = 0 | |
var trail = numbers.count-1 | |
while lead <= trail{ | |
let mid = (lead+trail)/2 | |
if numbers[mid].key == T-tempA[i]{ | |
ans += numbers[mid].value | |
break | |
}else if numbers[mid].key > T-tempA[i]{ | |
trail = mid-1 | |
}else{ | |
lead = mid+1 | |
} | |
} | |
} | |
print(ans) |

'Problem Solving > BOJ' 카테고리의 다른 글
[15991] 1, 2, 3 더하기 6 (0) | 2022.12.24 |
---|---|
[2232] 지뢰 (0) | 2022.12.21 |
[2610] 회의준비 (0) | 2022.12.19 |
[14594] 동방 프로젝트 (Small) (0) | 2022.12.18 |
[16168] 퍼레이드 (0) | 2022.12.16 |