수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.
백준 11659 상세보기
작성해야할 코드를 단계별로 생각해 본다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// 1. 입력
// N (데이터의 개수), M(합을 구해야하는 횟수)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bufferedReader.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// 2. N개의 숫자 입력과 동시에 합배열 구하기
// S[i] = S[i-1] + A[i]
st = new StringTokenizer(br.readLine());
int[] S = new int[N+1];
for(int i=1; i<N+1; i++) {
S[i] = S[i-1] + Integer.parseInt(st.nextToken());
}
// 3. 합배열을 이용해서 구간 합 구하기
// 구간 합 = S[j] - S[i-1]
// sNum(구간합의 시작), eNum(구간합의 끝)
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int sNum = Integer.parseInt(st.nextToken());
int eNum = Integer.parseInt(st.nextToken());
System.out.println(S[eNum] - S[sNum-1]);
}
}
}
입력 데이터가 많을 경우 Scanner보다 BufferedReader를 사용하는 것이 속도가 더 빠르다.
S[i] = S[i-1] + A[i]
배열 A가 다음과 같을 때, 누적 합 배열을 계산하는 과정이다. 이때, 계산을 편하게 하기 위해 인덱스는 1부터 시작하도록 한다.
S[j] - S[i-1]
A[i] 부터 A[j] 까지의 합을 구할 경우 '구간 합'을 사용한다. 구간 합 계산을 위해 합배열을 사용한다.