Algorithm/BOJ

백준 2143 두 배열의 합

삼쓰 웅쓰 2021. 3. 5. 13:44
728x90

출처: www.acmicpc.net/problem/2143

분류: 이분 탐색, 투 포인터


접근방식

합이 0인 네 정수 문제와 비슷했던 문제였습니다. 

주어진 각 배열에서 나올 수 있는 부분합을 모두 구해준 뒤 정렬해서 

투 포인터로 해결했습니다.

마찬가지로 T인 케이스를 찾았을 때 중복인 수의 개수를 세서 쌍을 찾아줘야 합니다 :)

 

해결방법

let t = Int(readLine()!)!
let n = Int(readLine()!)!
let a = readLine()!.split(separator: " ").map { Int(String($0))! }
let m = Int(readLine()!)!
let b = readLine()!.split(separator: " ").map { Int(String($0))! }

var aSum = [Int]()
var bSum = [Int]()

for i in 0..<a.count {
    var tempSum = a[i]
    aSum.append(tempSum)
    for j in i+1..<a.count {
        tempSum += a[j]
        aSum.append(tempSum)
    }
}

for i in 0..<b.count {
    var tempSum = b[i]
    bSum.append(tempSum)
    for j in i+1..<b.count {
        tempSum += b[j]
        bSum.append(tempSum)
    }
}

aSum.sort(by: <)
bSum.sort(by: <)

var aIdx = 0
var bIdx = bSum.count-1

var validCase = 0
while aIdx < aSum.count, bIdx >= 0 {
    let sum = aSum[aIdx] + bSum[bIdx]
    if sum == t {
        let validA = aSum[aIdx]
        let validB = bSum[bIdx]
        var duplicatedA = 0
        var duplicatedB = 0
        
        while aIdx < aSum.count, aSum[aIdx] == validA {
            duplicatedA += 1
            aIdx += 1
        }
        
        while bIdx >= 0, bSum[bIdx] == validB {
            duplicatedB += 1
            bIdx -= 1
        }
        
        validCase += duplicatedA * duplicatedB
    } else if sum < t {
        aIdx += 1
    } else {
        bIdx -= 1
    }
}

print(validCase)

 

배운점

유사한 문제를 풀었는데도 처음에 중복을 제대로 계산해주지 못했고,

실수를 많이해서 생각보다 시간이 좀 걸렸었다.