Algorithm/BAEKJOON

[Java] 11659 구간 합 구하기 4

곽수진 2023. 4. 5. 19:16
반응형

문제

수 N개가 주어졌을 때 i번째 수에서 j번째 수까지의 합을 구하는 프로그램을 작성하시오.

 

입력

1번째 줄에 수의 개수 N(1 <= N <= 100,000), 합을 구해야 하는 횟수 M(1 <= M <= 100,000), 2번째 줄에 N개의 수가 주어진다. 각 수는 1,000보다 작거나 같은 자연수다. 3번째 줄부터는 M개의 줄에 합을 구해야 하는 구간 i와 j가 주어진다.

 

출력

총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다

 

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

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        
        int dataNum = Integer.parseInt(stringTokenizer.nextToken());
        int quizNum = Integer.parseInt(stringTokenizer.nextToken());
        
        long[] sumArr = new long[dataNum + 1];
        stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        
        for(int i=1; i<= dataNum; i++){
            sumArr[i] = sumArr[i-1] + Integer.parseInt(stringTokenizer.nextToken());
        }
        
        for(int j=0; j<quizNum; j++){
            stringTokenizer = new StringTokenizer(bufferedReader.readLine());
            
            int start = Integer.parseInt(stringTokenizer.nextToken());
            int end = Integer.parseInt(stringTokenizer.nextToken());
            System.out.println(sumArr[end] - sumArr[start-1]);
        }
    }
}

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)) : 사용자로부터 값을 입력받음

BufferedReader
- 기존의 Scanner와 유사한 기능
- 입력된 데이터가 버퍼를 거쳐 전달되기 때문에 데이터 처리 효율성을 높이고 속도가 훨씬 빨라 많은 양의 데이터를 처리할 때 유리함
- 입력 받은 데이터가 String으로 고정되기 때문에 입력받은 데이터를 가공하는 작업이 필요한 경우가 많음
- readLine()은 String으로 return 값이 고정되기 때문에 다른 타입으로 입력을 받으려면 형변환이 필요함

 

▶ StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()) : 사용자로부터 입력 받은 String의 문자열을 원하는 문자열을 기준으로 나눔

StringTokenizer
- String의 문자열을 원하는 문자열을 기준으로 나눌 수 있는 클래스

 

int dataNum = Integer.parseInt(stringTokenizer.nextToken()) : 사용자로부터 입력받은 값을 공백 단위로 구분하고 Integer로 형변환하여 호출함

Token : 나누는 문자의 각 대상
- countTokens() : 토큰의 개수 확인
- hasMoreTokens() : 토큰이 더 남아있는지 확인
- nextToken() : 공백 단위로 구분한 토큰을 불러옴 

 

long[] sumArr = new long[dataNum + 1] : 합배열 sumArr 선언

    → 편의상 dataNum 크기의 배열에 1씩 더해 배열이 sumArr[1], sumArr[2], ...로 나오도록 함 

 for(int i=1; i<= dataNum; i++){sumArr[i] = sumArr[i-1] + Integer.parseInt(stringTokenizer.nextToken());} : dataNum만큼 반복문을 돌리며 합배열 sumArr 생성

 for(int j=0; j<quizNum; j++){System.out.println(sumArr[end] - sumArr[start-1]);} : 구간 합을 구할 질문 개수 quizNum만큼 반복문을 돌리며 start부터 end까지의 부분 배열 합을 출력

반응형

'Algorithm > BAEKJOON' 카테고리의 다른 글

[Java] 10986 나머지 합  (0) 2023.04.08
[Java] 11660 구간 합 구하기 5  (0) 2023.04.07
[Java] 1546 평균 구하기  (0) 2023.04.04
[Java] 11720 숫자의 합 구하기  (0) 2023.04.02
[ C / C++ ] 백준 20301 반전 요세푸스  (0) 2022.05.21