수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.
총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다.
1 ≤ N ≤ 100,000
1 ≤ M ≤ 100,000
1 ≤ i ≤ j ≤ N
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int arrLength = sc.nextInt();
int queryNum = sc.nextInt();
int[] numArr = new int[arrLength];
int[] sumArr = new int[arrLength];
for (int i = 0; i < arrLength; i++) {
int input = sc.nextInt();
numArr[i] = input;
if (i > 0) {
sumArr[i] = sumArr[i - 1] + numArr[i];
} else {
sumArr[i] = numArr[i];
}
}
for (int j = 0; j < queryNum; j++) {
int start = sc.nextInt() - 2;
int last = sc.nextInt() - 1;
if (start < 0) {
System.out.println(sumArr[last]);
} else {
System.out.println(sumArr[last] - sumArr[start]);
}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class P11659_구간합구하기 {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader
= new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer
= new StringTokenizer(bufferedReader.readLine());
int suNo = Integer.parseInt(stringTokenizer.nextToken());
int quizNo = Integer.parseInt(stringTokenizer.nextToken());
long[] S = new long[suNo + 1];
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for (int i = 1; i <= suNo; i++) {
S[i] = S[i - 1] + Integer.parseInt(stringTokenizer.nextToken());
}
for (int q = 0; q < quizNo; q++) {
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int i = Integer.parseInt(stringTokenizer.nextToken());
int j = Integer.parseInt(stringTokenizer.nextToken());
System.out.println(S[j] - S[i - 1]);
}
}
}
위에 사진이 나의 풀이에 사용된 메모리와 시간이고, 밑에는 예시 풀이의 메모리와 시간이다.
확실히 Buffered Reader, StringTokenizer를 함께 사용하니까 단순히 Scanner를 사용하는 것보다 코드는 조금 길어졌지만 사용되는 메모리와 시간이 많이 줄었다.
나중에 공간이나 시간 때문에 실패하는 경우가 생긴다면 이쪽을 한번 의심해보는 것은 어떨까?
밑에 글을 함께 보면 좋을 것 같다.
https://velog.io/@roycewon/BufferedReader%EB%A5%BC-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90
그리고 예제 풀이에서는 S[1]부터 인덱스를 사용하였는데.. 나는 S[0]부터 사용하였다. 전자가 좀 더 문제 풀이에는 편리하고 직관적이지만, 아무래도 조금 꺼림칙?한 건 사실이다. 어느게 더 맞는 것일까?