https://www.acmicpc.net/problem/11659
11659번: 구간 합 구하기 4
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j
www.acmicpc.net
접근 과정
1. 어떤 문제로 이해 했는가? 그리고 문제의 제약 조건은?
N개의 숫자가 주어졌을 때, 인덱스 i에서 j까지의 합을 구하는 문제
시간제한 : 1초
1 ≤ N ≤ 100,000
1 ≤ M ≤ 100,000
1 ≤ i ≤ j ≤ N
2. 나의 방식대로 문제를 재정의 하자.
구간합을 구하는 문제
3. 어떤 알고리즘과 자료구조를 사용할 것인가?
구간합을 구해야 한다.
값을 하나씩 더하는 경우 시간복잡도가 n^2이기 때문에 100,000 * 100,000으로 1초가 넘는다.
그렇기 때문에 주어진 리스트를 for문을 통해 1부터 값을 저장하는데
ary[0] = 0으로 설정한 후, ary[1] 부터는 누적인 값을 저장한다.
이후에 3번 인덱스의 값을 알고싶으면 ary[3]-ary[2]
3~5 인덱스합의 값을 알고싶으면 ary[5]-ary[2] 이런식으로 값을 쉽게 유추할 수 있다.
4. 어떻게 계산할 것인가?
1) 입력
bufferedReader
StringTokenizer
2) 시간 복잡도 계산
O(n)
5. 주의할 점은 무엇인가?
시간초과에 주의하기
6. 풀이 과정
import java.io.*;
import java.util.*;
public class q11659 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Integer N = Integer.parseInt(st.nextToken());
Integer M = Integer.parseInt(st.nextToken());
Integer[] ary = new Integer[N+1];
ary[0] = 0;
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
ary[i] = ary[i-1] + Integer.parseInt(st.nextToken());
}
Integer start;
Integer end;
for (int i = 1; i <= M; i++) {
st = new StringTokenizer(br.readLine());
start = Integer.parseInt(st.nextToken());
end = Integer.parseInt(st.nextToken());
System.out.println(ary[end] - ary[start-1]);
}
br.close();
}
}
7. 개선점
누적합 개념을 처음 적용해보기 때문에 잘 알아두기!
'코딩테스트' 카테고리의 다른 글
[백준 1668번] 트로피 진열 (0) | 2022.01.11 |
---|---|
[백준 11951번] 태상이의 훈련소 생활 (0) | 2022.01.11 |
[백준 6603번] 로또 (0) | 2022.01.10 |
[백준 7568번] 덩치 (0) | 2022.01.10 |
[백준 1921번] 정수 삼각형 (0) | 2021.07.12 |