문제
수 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 |