백준 11659번 (누적합 배열)

김경욱·2025년 9월 20일

백준

목록 보기
85/121

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

import java.util.*;

import static java.util.Collections.*;

public class Main {
public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    StringBuilder sb = new StringBuilder();

    StringTokenizer st = new StringTokenizer(br.readLine());

    int N = Integer.parseInt(st.nextToken());
    int M = Integer.parseInt(st.nextToken());

    StringTokenizer st2 = new StringTokenizer(br.readLine());


    long[] prefix = new long[N+1];
    prefix[0] = 0;


    for (int i = 1 ; i <= N; i++)
    {
        long num = Long.parseLong(st2.nextToken());
        prefix[i] = prefix[i-1]+num;
    }


    for (int i = 0; i < M; i++)
    {
        StringTokenizer st3 = new StringTokenizer(br.readLine());

        int first = Integer.parseInt(st3.nextToken());
        int second = Integer.parseInt(st3.nextToken());

        long total = prefix[second] - prefix[first-1];




        sb.append(total+"\n");





    }

    System.out.println(sb);









}

}

맨 처음에는 입력받은 값들을 배열로 저장하여 반복문을 이용하여 풀려 하였지만 시간 초과가 발생하여 아예 입력받은 값들을 배열로 저장하는게 아니라 처음부터 누적합 배열을 만들어 누적합을 구한 후에 second번째 배열에서 first-1번째 배열을 빼서 그 범위의 누적합만 구하는 방식이었다. 신박하고 좋은 방식인 것 같다.

0개의 댓글