본문 바로가기

백준

[백준][JAVA]구간 합 구하기4(11659번) - 누적합

반응형

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

 

11659번: 구간 합 구하기 4

첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j

www.acmicpc.net

* 문제는 해당 게시물 참고바랍니다.

 

해당 문제는 누적합을 구하는 문제입니다.

 

근데 그냥 풀면 시간 초과가 나옵니다.

수 많은 시행 착오를 겪었습니다.

 

해당 문제를 해결한 코드에 대해 설명하겠습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {

    static StringBuilder sb = new StringBuilder();
    public static int[]arr;
    public static int[]sum;
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        arr = new int[n];
        sum = new int[n];

        st = new StringTokenizer(br.readLine());
        
        for(int i=0; i<n; i++){
            int tmp =0;
            arr[i] = Integer.parseInt(st.nextToken());
            for(int j=0; j<i+1; j++){
                tmp += arr[j];
            }
            sum[i] = tmp;
        }


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

            int input1 = Integer.parseInt(st.nextToken());
            int input2 = Integer.parseInt(st.nextToken());

            sb.append(sum[input2 - 1] - sum[input1 - 1] + arr[input1 -1] + "\n");
        }

        System.out.println(sb);

    }
}

scanner는 시간을 엄청 잡아 먹기 때문에  이번에 StringTokenizer에 대해 배우게 되었습니다.

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

StringTokenizer 클래스의 객체를 생성하여 StringTokenizer를 사용합니다.

 

StringTokenizer의 경우 공백이 있는 문자열을 말 그대로 token화 하여 가져옵니다.

또한 readLine을 이용하여 라인 단위로 읽습니다.

 

int n = Integer.parseInt(st.nextToken());

해당 코드와 같이 integer값을 읽기 위해서는 tokenizer는 기본적으로 string으로 읽어오기 때문에 형변환을 해줘야 합니다.

 

 

줄이 바뀐다면

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

해당 코드를 사용해야지만 정상적으로 읽어옵니다.

 

 

반응형