PS(Problem Solving)/BOJ

[백준/BOJ] 11659번: 구간 합 구하기 4

JunsuKim 2022. 1. 27.
728x90

https://www.acmicpc.net/problem/11659

 

11659번: 구간 합 구하기 4

첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j

www.acmicpc.net

문제

수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.

해설

문제를 처음 봤을 때 M번 반복을 할 반복문 안에 i부터 j까지의 합을 구할 반복문을 하나 더 민들어 이중 반복문을 통해 풀었다.

for(i in 0 until M) {
    var sum = 0
    for(a in i .. j) {
        sum += arr[a]
    }
}

하지만 이렇게 풀었더니 시간 초과가 났다.

 

해결법을 찾아보니 prefix sum 알고리즘을 알게 되었다.

prefix sum 알고리즘이란 부분합을 미리 구해 놓고 start - 1의 값을 빼주면 된다.

이를 이용하면 이중 for문을 쓸 필요없이 단일 for문으로 문제를 해결할 수 있다.

 

prefix sum 알고리즘을 사용한 코드를 보면 좀 더 이해하기 쉬울 것이다.

소스 코드

import java.util.*

fun main() {
    var st = StringTokenizer(readLine())
    val n = st.nextToken().toInt()
    val m = st.nextToken().toInt()

    val arr = IntArray(100001) { 0 }
    st = StringTokenizer(readLine())
    for(i in 1 .. n) arr[i] = st.nextToken().toInt()

    val sum = IntArray(100001)
    for(i in 0 .. n) {
        if(i == 0) sum[i] = arr[i]
        else sum[i] = sum[i-1] + arr[i]
    }

    for(i in 0 until m) {
        st = StringTokenizer(readLine())
        val start = st.nextToken().toInt()
        val end = st.nextToken().toInt()
        println(sum[end] - sum[start-1])
    }
}

 

728x90

'PS(Problem Solving) > BOJ' 카테고리의 다른 글

[백준/BOJ] 9613번: GCD 합  (0) 2022.01.27
[백준/BOJ] 15654번: N과 M(5)  (0) 2022.01.27
[백준/BOJ] 2003번: 수들의 합 2  (0) 2022.01.26
[백준/BOJ] 1406번: 에디터  (0) 2022.01.26
[백준/BOJ] 1699번: 제곱수의 합  (0) 2022.01.25

댓글