문제 풀이 날짜: 2023.05.15
포스트 작성일: 2023.05.18
* 학습 목적으로 작성하는 글입니다. 풀이가 정석적이지 못할 수도 있습니다.
문제 출처
백준 온라인 저지 11659번: 구간 합 구하기 4 (실버3) (문제 링크)
키워드
구간 합
풀이 접근법
- 평범하게 중첩 for문으로 합을 구하면 시간초과가 된다. (N ≤ 10^5, M ≤ 10^5, N*M ≤ 10^10)
- DP와 유사한 발상에서 출발한다. 구했던 값을 또 구할 수도 있기 때문에 미리 배열의 합을 저장해놓는 것이 중요하다.
- 1부터의 k까지의 합을 미리 배열에 저장해놓고 중간 구간의 부분 합 = 큰 구간의 부분 합 - 작은 구간의 부분 합의 형태로 원하는 답을 구한다.
- 예를 들어, 3부터 7까지의 합을 구하고 싶다면 (1부터 7까지의 합) - (1부터 2까지의 합)을 구한다.
- 이렇게 하면 O(N + M) 시간만에 답을 구할 수 있다.
코드
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));
String[] temp = br.readLine().split(" ");
int N = Integer.parseInt(temp[0]);
int M = Integer.parseInt(temp[1]);
int[] numbers = new int[N + 1];
int[] sum = new int [N + 1];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 1; i <= N; i++) {
numbers[i] = Integer.parseInt(st.nextToken());
sum[i] = sum[i - 1] + numbers[i];
}
StringBuilder sb = new StringBuilder();
while(M-- > 0) {
temp = br.readLine().split(" ");
int start = Integer.parseInt(temp[0]);
int end = Integer.parseInt(temp[1]);
int sumOfSections = sum[end] - sum[start - 1];
sb.append(sumOfSections).append('\n');
}
System.out.print(sb);
}
}
매우 쉬운 문제이지만, 구간 합에 대한 이해가 없다면 시간초과를 받고 헤멜 수도 있다고 생각한다. 이런 스킬은 기초를 잘 알아두면 후에 여러 문제에 응용할 수 있으므로 잘 공부해두는 것이 좋겠다.
git 링크
https://github.com/jinju9553/23-CodingTest/blob/main/week8/day2/Q11659.java
'Study > Problem Solving' 카테고리의 다른 글
[SWEA / Java] 1249번: 보급로 (D4) (0) | 2023.05.19 |
---|---|
[백준 / Java] 11054번: 가장 긴 바이토닉 부분 수열 (골드4) (0) | 2023.05.18 |
[백준 / Java] 13305번: 주유소 (실버3) (0) | 2023.05.18 |
[SWEA / Java] 1208번: Flatten (D3) (0) | 2023.05.18 |
[SWEA / Java] 1206번: View (D3) (0) | 2023.05.18 |