본문 바로가기
백준

백준 / BOJ / 11441 / 합 구하기

by 너츠너츠 2021. 11. 7.

문제

N개의 수 A1, A2, ..., AN이 입력으로 주어진다. 총 M개의 구간 i, j가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 둘째 줄에는 A1, A2, ..., AN이 주어진다. (-1,000 ≤ Ai ≤ 1,000) 셋째 줄에는 구간의 개수 M이 주어진다. (1 ≤ M ≤ 100,000) 넷째 줄부터 M개의 줄에는 각 구간을 나타내는 i와 j가 주어진다. (1 ≤ i ≤ j ≤ N)

해설

이 문제는 1초라는 제한 시간 안에 M개의 질문에 대한 범위합을 구해야하기 때문에 하나하나 반복문을 돌리기엔 시간이 부족합니다. 따라서 누적합을 활용하여 시간을 단축시켜야 합니다.

 

import java.io.*;
import java.util.*;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static StringBuilder sb = new StringBuilder("");

    static int N, M;
    static int[] dp;

    static void input() throws IOException {
        N = Integer.parseInt(br.readLine());
        dp = new int[N+1];
        st = new StringTokenizer(br.readLine());
        for(int i=1; i<=N; i++)
            dp[i] = dp[i-1] + Integer.parseInt(st.nextToken());
        M = Integer.parseInt(br.readLine());
    }

    static void process() throws IOException{
        for(int i=0; i<M; i++){
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            sb.append(dp[y]-dp[x-1]).append('\n');
        }
        System.out.print(sb);
    }

    public static void main(String[] args) throws IOException{
        input();
        process();
    }
}

 

<링크>

https://www.acmicpc.net/problem/11441

반응형

댓글