: 합 배열을 이용해 시간 복잡도를 더 줄이기 위한 알고리즘
(1) 구현 과정
구간 합 알고리즘을 활용하려면 먼저 합 배열을 구해야 한다. 배열 A가 있을 때 합 배열 S는 다음과 같이 정의한다.
# 합 배열 S 정의
S[i] = A[0] + A[1] + A[2] + ... + A[i-1] + A[i] // A[0] ~ A[i] 까지의 합
sum[i] = sum[i-1] + arr[i]sum[j]-sum[i-1] // i에서 j까지의 구간 합sum[5] = arr[0] + arr[1] + arr[2]+ arr[3]+ arr[4]+ arr[5]
sum[1] = arr[0] + arr[1]
sum[5] - sum[1] = arr[2] + arr[3] + arr[4] + arr[5]
//sum[5]-sum[1]은 arr[2] ~ arr[5]까지의 구간 합
수 N개가 주어졌을 때 i번째 수에서 j번째 수까지의 합을 구하는 프로그램을 작성하시오.
입력
1번째 줄에 수의 개수 N(1 <= N <= 100,000), 합을 구해야 하는 횟수 M(1 <= M <= 100,000), 2번째 줄에 N개의 수가 주어진다. 각 수는 1,000보다 작거나 같은 자연수다. 3번째 줄부터는 M개의 줄에 합을 구해야하는 구간 i와 j가주어진다.
출력
총 M개의 줄에 입력으로 주어진 i 번째 수에서 j 번째 수까지의 합을 출력한다.
예제 입력
5 3 // 데이터의 개수, 질의 개수
5 4 3 2 1 // 구간 합을 구할 대상 배열
1 3
2 4
5 5
예제 출력
12
9
1
N개의 수를 입력받아 합 배열 생성
합 배열 공식: sum[i] = sum[i-1] + arr[i]
구간 i~j가 주어지면 구간 합을 구해 출력
구간 합 공식: sum[j] - sum[i-1]
suNo(숫자 개수), quizNo(질의 개수) 저장하기
for(숫자 개수만큼 반복하기) {
합 배열 생성하기(S[i] = S[i - 1] + A[i])
}
for(질의 개수만큼 반복하기) {
질의 범위 받기다 〜 j)
구간 합 출력하기(S[j] - S[i - 1])
}
// 구간 합 구하기 4_11659
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 br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int suNo = Integer.parseInt(st.nextToken());
int quizNo = Integer.parseInt(st.nextToken());
long[] S = new long[suNo + 1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= suNo; i++) {
S[i] = S[i - 1] + Integer.parseInt(st.nextToken());
}
for (int q = 0; q < quizNo; q++) {
st = new StringTokenizer(br.readLine());
int i = Integer.parseInt(st.nextToken());
int j = Integer.parseInt(st.nextToken());
System.out.println(S[j] - S[i - 1]);
}
}
}