문제: 백준 온라인 저지 11659번
수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.
입력: 첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.
출력: 총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다.
제한
1 ≤ N ≤ 100,000
1 ≤ M ≤ 100,000
1 ≤ i ≤ j ≤ N
코드
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer input = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(input.nextToken());
int m = Integer.parseInt(input.nextToken());
//합 배열
int[] arr = new int[n + 1];
arr[0] = 0;
input = new StringTokenizer(bf.readLine());
for(int i = 1; i <= n; i++){
arr[i] = arr[i - 1] + Integer.parseInt(input.nextToken());
}
//구간 합
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for(int k = 0; k < m; k++){
input = new StringTokenizer(bf.readLine());
int i = Integer.parseInt(input.nextToken());
int j = Integer.parseInt(input.nextToken());
bw.write(Integer.toString(arr[j] - arr[i-1]));
bw.newLine();
}
bw.flush();
bw.close();
}
}
추가 설명
: 구간 합 알고리즘을 사용하면 시간복잡도를 감소시킬 수 있다. 또한 Scanner를 사용하면 시간 초과가 발생할 우려가 있기 때문에 Buffer를 사용한다.
'CodingTest' 카테고리의 다른 글
6. 연속된 자연수의 합 구하기 (0) | 2025.05.14 |
---|---|
5. 나머지 합 구하기 (0) | 2025.05.04 |
4. 구간 합 구하기2 (1) | 2025.05.01 |
2. 평균 구하기 (2) | 2025.05.01 |
1. 숫자의 합 구하기 (0) | 2025.05.01 |