ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2143 두 배열의 합
    Algorithm/BOJ 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)

     

    배운점

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

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

     

     

    'Algorithm > BOJ' 카테고리의 다른 글

    백준 12100 2408(easy)  (0) 2021.03.08
    백준 18808 스티커 붙이기  (0) 2021.03.07
    백준 1939 중량제한  (0) 2021.03.04
    백준 7453 합이 0인 네 정수  (0) 2021.03.04
    백준 2110 공유기 설치  (0) 2021.03.03

    댓글

Designed by Tistory.