코딩테스트/백준

[백준 11659] 구간 합 구하기4 (Java)

imachill7guy 2025. 2. 23. 17:25

구간 합 구하기 4 

https://www.acmicpc.net/problem/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

예제 입력 1 

5 3
5 4 3 2 1
1 3
2 4
5 5

예제 출력 1 

12
9
1

 


풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 구간합구하기 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine()); // 1번째 줄 읽음

        int N = Integer.parseInt(st.nextToken()); // 데이터의 개수
        int quizeNum = Integer.parseInt(st.nextToken()); // 질의 개수

        long[] sumArr = new long[N+1]; // N+1 크기의 합배열 선언

        st = new StringTokenizer(br.readLine()); // 2번째 줄 읽음

        // 구간합 만들기
        for(int i=1; i <= N; i++){
            sumArr[i] = sumArr[i-1] + Integer.parseInt(st.nextToken());
        }

        // 질의개수 만큼 반복
        for(int i=0; i < quizeNum; i++){
            st = new StringTokenizer(br.readLine()); // 다음줄 읽기
            int n = Integer.parseInt(st.nextToken()); // n번째 수
            int m = Integer.parseInt(st.nextToken()); // m번째 수

            System.out.println(sumArr[m]-sumArr[n-1]);
        }
    }
}

 

구간의 합을 구하고자 할때는 구간합을 이용하자

배열 A가 있을 때 합배열은 S는 아래와 같이 정의할 수 있다.

 

S[i] = A[0] + A[1] + A[2] + ... + A[i]

 

예를들어 1 ~3사이의 합을 구하고 싶다면

S[3] = A[0] + A[1] + A[2] + A[3] 이고

S[0] = A[0] 이므로 

 

S[3] - S[0] = A[1] + A[2] + A[3]이다.

 

따라서 공식은 아래와 같이 정의할 수 있다.

i ~ j 사이의 값을 구하고자 한다면

S[j] - S[i-1] 이다.