백준 [2143] - kotlin

[문제]

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

[풀이]

A에서 가능한 부분합을 모두 구하고 B에서 가능한 부분합을 모두 구한다.

 

A의 부분합이 저장된 배열을 sum_a라고 하고, B의 부분합이 저장된 배열을 sum_b라고 했을 때,

sum_a[i] = T - sum_b[j] 를 만족하는 i와  j값을 찾아야 한다.

 

단순하게 찾으면 메모리 초과 또는 시간 초과가 발생하여 

 

i를 고정해두고, j의 값을 lowerBound와 upperBound를 이용하여 찾은 다음 

upperBound에서 lowerBound의 차를 구하여 ans에 더해주면 된다.

[코드]

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))


    var T = br.readLine().toInt()
    var N = br.readLine().toInt()
    var A = br.readLine().split(" ").map{ it.toInt() } as MutableList<Int>
    var M = br.readLine().toInt()
    var B = br.readLine().split(" ").map{ it.toInt() } as MutableList<Int>

    var sum_a = mutableListOf<Int>()
    var sum_b = mutableListOf<Int>()

    for(i in A.indices){
        var sum = A[i]
        sum_a.add(sum)
        for(j in i+1 until A.size) {
            sum += A[j]
            sum_a.add(sum)
        }
    }
    for(i in B.indices){
        var sum = B[i]
        sum_b.add(sum)
        for(j in i+1 until B.size) {
            sum += B[j]
            sum_b.add(sum)
        }
    }

    sum_a.sort()
    sum_b.sort()
    var ans = 0L
    for(i in sum_a.indices){
        val tmp = T - sum_a[i]
        val ub = upperBound(sum_b, tmp)
        val lb = lowerBound(sum_b, tmp)
        ans += (ub - lb)
    }

    bw.write(ans.toString())
    bw.flush()
    bw.close()
}

fun lowerBound(arr : MutableList<Int>, target : Int) : Int {
    var left = 0
    var right = arr.size
    while (left < right)
    {
        val mid = (left + right) / 2
        if(arr[mid] < target) left = mid + 1
        else right = mid
    }
    return right
}

fun upperBound(arr : MutableList<Int>, target: Int) : Int {
    var left = 0
    var rihgt = arr.size
    while (left < rihgt)
    {
        val mid = (left + rihgt) / 2
        if(arr[mid] <= target) left = mid + 1
        else rihgt = mid
    }
    return rihgt
}

'백준 > 기타' 카테고리의 다른 글

백준 [10021] kotlin  (0) 2023.01.29
백준 [2179] kotlin  (0) 2023.01.28
백준 [1197] kotlin  (0) 2023.01.27
백준 [10830] kotlin  (0) 2023.01.22
백준 [9935] kotlin  (0) 2023.01.19