백준 11659 구간 합 구하기 4 Kotlin

: ) YOUNG·2023년 8월 9일
1

알고리즘

목록 보기
233/422
post-thumbnail

백준 11659번
https://www.acmicpc.net/problem/11659

문제




생각하기


  • 누적 합 문제이다.

동작


    // 누적 합 구하기
    arr = IntArray(N + 1)
    StringTokenizer(br.readLine()).run {
        for (i in 1..N) {
            arr[i] = arr[i - 1] + nextToken().toInt()
        }
    }

누적 합을 미리 배열에 저장한다.

Ex)

[1, 2, 3, 4, 5] 배열일 경우
[1, 3, 6, 10, 15]라는 배열이 된다.

여기서 구간 사이의 합을 구할 때는 [3, 5] 라고 할 때

5까지의 누적합을 사용하면 되지만, 1 2의 합의 값은 없어야 한다. 그렇게 하려면

2의 누적 합을 제거 해주면 된다.
이렇게되면 arr[5] - arr[3 - 1]이 구간의 합을 구할 수 있는 방법이 된다.



코드


Kotlin


import java.io.*
import java.util.*

// input
private lateinit var br: BufferedReader

// variables
private var N = 0
private var M = 0
private lateinit var arr: IntArray

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

    input()

    bw.write(solve())
    bw.close()
} // End of main

private fun solve(): String {
    val sb = StringBuilder()

    // 구간 합 구하기
    repeat(M) {
        StringTokenizer(br.readLine()).run {
            val start = nextToken().toInt()
            val end = nextToken().toInt()

            sb.append(arr[end] - arr[start - 1]).append('\n')
        }
    }

    return sb.toString()
} // End of solve

private fun input() {
    StringTokenizer(br.readLine()).run {
        N = nextToken().toInt()
        M = nextToken().toInt()
    }

    // 누적 합 구하기
    arr = IntArray(N + 1)
    StringTokenizer(br.readLine()).run {
        for (i in 1..N) {
            arr[i] = arr[i - 1] + nextToken().toInt()
        }
    }
} // End of input

0개의 댓글