알고리즘
[Java] 백준 11659번 구간 합 구하기 4
J3SUNG
2023. 2. 8. 22:22
728x90
구간합을 구하는 문제입니다.
수열이 주어지고 i~j까지의 수의 합을 출력하면 됩니다.
수열의 길이는 최대 10만이며 구간합은 최대 10만번 구해야합니다.
구간합을 매번 구해주게 되면은 시간초과가 발생하게 됩니다.
이를 해결하기 위해 누적합을 사용합니다.
차례대로 누적합을 구해줍니다.
구하려고 하는 a~b의 구간합을 구하기 위해서
b까지의 구간합 - (a-1)까지의 구간합을 계산해주었습니다.
sum[b] - sum[a-1]
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] arr = new int[n+1];
int[] sum = new int[n+1];
st = new StringTokenizer(br.readLine());
arr[1] = Integer.parseInt(st.nextToken());
sum[1] = arr[1];
for(int i=2; i<=n; ++i) {
arr[i] = Integer.parseInt(st.nextToken());
sum[i] = sum[i-1] + arr[i];
}
for(int i=1; i<=m; ++i) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println(sum[b] - sum[a-1]) ;
}
}
}