import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
try (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());
int[] arr = new int[N + 1];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 1; i <= N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
arr[i] += arr[i - 1];
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine(), " ");
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
System.out.println(arr[end] - arr[start - 1]);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 각 원소 순차적으로 구간합을 기록하고
- 만약 2 ~ 4 이라면
- 1 ~ 4 까지의 구간합에서
- 1까지의 구간합을 빼면
- 2 3 4 의 모든 합이 도출된다.
for (int i = 0; i < M; i++) { st = new StringTokenizer(br.readLine(), " "); int start = Integer.parseInt(st.nextToken()); int end = Integer.parseInt(st.nextToken()); System.out.println(arr[end] - arr[start - 1]); }
- 그 과정이 이 과정이다.
- 만약 2 ~ 4 이라면
- 근데 프린트 스트림의 경우 사용할때마다 스트림을 열고 닫는 과정을 수행한다.
- 반복 for 반복문이 만약 반복과정을 많이 수행하는 경우 상대적으로 수행시간이 오래 걸릴 수 밖에 없다.
- 그래서 일단 출력할 모든 원소를 StringBuilder 에 담아놓고 출력하는 방법이 최적화 방법중 하나이다.
변경 코드
package org.example.알고리즘.구간합구하기4;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
try (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());
int[] arr = new int[N + 1];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 1; i <= N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
arr[i] += arr[i - 1];
}
StringBuilder sb = new StringBuilder(M + 1);
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine(), " ");
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
sb.append(arr[end] - arr[start - 1]).append("\n");
}
System.out.println(sb);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Uploaded by N2T
'자바 > 알고리즘' 카테고리의 다른 글
[코틀린 ] 5525 IOIOI [문자열] (0) | 2024.03.02 |
---|---|
[코틀린] 21736 헌내기는 친구가 필요해 (0) | 2024.03.01 |
[알고리즘] 최소 신장 트리 || 최소 스피닝 트리 (MST) (0) | 2024.02.19 |
[알고리즘] 백준 1927 최소 힙 (0) | 2024.02.12 |
[백준] [Silver I] Z - 1074 (0) | 2024.02.09 |