![[Java] 백준 11659번 문제(구간 합 구하기 4)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmm3iW%2FbtsIlD8V1sY%2Fknk8fdB7yHHUxpsyVLQmak%2Fimg.png)
[Java] 백준 11659번 문제(구간 합 구하기 4)자료구조 & 알고리즘/BOJ2024. 7. 3. 13:15
Table of Contents
문제 링크 : https://www.acmicpc.net/problem/11659
문제설명
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Boj_11659
{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// n과 m을 받아옴
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
// 구간합 배열 생성
int[] sumArr = new int[n + 1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i < n + 1; ++i) sumArr[i] += Integer.parseInt(st.nextToken()) + sumArr[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());
sb.append(sumArr[end] - sumArr[start - 1]).append("\n");
}
System.out.println(sb);
}
}
설명
문제에서 수의 개수와, 합을 구해야 하는 횟수는 최대 100,000이다.
게다가 구간마다 합을 매번 계산하면 0.5초 안에 모든 구간 합 계산을 끝낼 수 없다.
이럴 때 구간 합을 이용해야 한다.
인덱스 | 0 | 1 | 2 | 3 | 4 | 5 |
입력값 | X | 5 | 4 | 3 | 2 | 1 |
sumArr | 0 | 5 | 9 | 12 | 14 | 15 |
구간의 시작 인덱스를 start, 끝 인덱스를 end로 변수명을 정하면 아래와 같은 식으로 구간 합을 빠르게 구할 수 있다.
sumArr[end] - sumArr[start - 1]
- (1, 3) : sumArr[3] - [0] = 12 - 0 = 12
- (2, 4) : sumArr[2] - [4] = 14 - 5 = 9
- (5, 5) : sumArr[5] - [5] = 15 - 14 = 1
'자료구조 & 알고리즘 > BOJ' 카테고리의 다른 글
[Java] 백준 10986번 문제(나머지 합) (0) | 2024.07.06 |
---|---|
[Java] 백준 11660번 문제(구간 합 구하기 5) (0) | 2024.07.04 |
[Java] 백준 5988번 문제 (0) | 2024.07.02 |
[Java] 백준 16916번 문제 (부분 문자열) (0) | 2023.11.29 |
[Java] 백준 1786번 문제(찾기) (0) | 2023.11.29 |