[TIL]구간합
구간합(Prefix Sum)
배열을 이용한 알고리즘이다.
합배열
배열 A가 있을 때 합배열 S구하기. S[i]는 A[0]부터 A[i]까지의 합
1
2
S[i] = A[0] + A[1] + A[2] + ... + A[i - 1] + A[i]
S[i] = S[i - 1] + A[i]
구간합
합배열을 이용해 배열 A의 특정 구간의 합을 쉽게 구할 수 있다.
1
2
3
4
/*
배열 A의 i에서 j까지의 구간합을 구해보자.
*/
S[p] = S[j] - S[i - 1]
코드 구현(백준 11659)
정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); // 시간복잡도를 생각해서 Scanner보다 빠른 버퍼리더를 사용해준다.
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); // 나열된 숫자를 int로 받게 되면 시간이 많이 걸려 stringtokenizer를 이용해 받아준다.
int n = Integer.parseInt(stringTokenizer.nextToken());
int m = Integer.parseInt(stringTokenizer.nextToken());
long[] S = new long[n + 1]; // i-1 작업 없이 바로 사용하기 위해 n+1을 해준다.
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for (int i = 1; i < n + 1; i++) {
S[i] = S[i - 1] + Integer.parseInt(stringTokenizer.nextToken());
}
for (int q = 0; q < m; q++) {
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int i = Integer.parseInt(stringTokenizer.nextToken());
int j = Integer.parseInt(stringTokenizer.nextToken());
long answer = S[j] - S[i - 1]; // 구간합 공식을 사용해준다.
System.out.println(answer);
}
}
}
This post is licensed under CC BY 4.0 by the author.