본문 바로가기

알고리즘

백준 1806 부분합 코틀린

반응형
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*


var start = 0
var min = Int.MAX_VALUE
var sum = 0
fun main(args: Array<String>) {
    val br =
        BufferedReader(InputStreamReader(System.`in`))
    val line = br.readLine()
    val n = line.split(" ").toTypedArray()[0].toInt()
    val m = line.split(" ").toTypedArray()[1].toInt()
    val arr = IntArray(n)
    val st = StringTokenizer(br.readLine())
    for (i in 0 until n) {
        arr[i] = st.nextToken().toInt()
    }
    for (i in arr.indices) {
        val num = arr[i]

        if (num >= m) {
            println(1)
            return
        }
        sum += num

        if (sum > m) {
            getMin(i)
            setSum(arr, m, i)
        } else if (sum==m) {
            getMin(i)
        }
    }

    println(if (min == Int.MAX_VALUE) 0 else min)

}

fun setSum(arr: IntArray, m: Int, end: Int) {
    while (sum > m) {
        sum -= arr[start++]
        if (sum>=m) {
            getMin(end)
        }
    }
}

fun getMin(end: Int) {
    val length = end - start + 1
    if (min > length) {
        min = length
    }
}

투포인터 문제 길이가 수들의 합2와 비슷한 문제이다.
m과 같거나 큰 수들의 연속합 중에 가장 작은 값을 구하면 되는데..
length에 +1과 sum의 크기에 따라 범위를 잘 정해야 한다.
위에도 범위 때문에 중복되는 로직이 있을 수 도 있다.

반응형