[baekjoon/c++] 구간 합 구하기 4 - 11659 : 누적합
[Silver III] 구간 합 구하기 4 - 11659
성능 요약
메모리: 2800 KB, 시간: 36 ms
분류
누적 합
제출 일자
2025년 2월 4일 19:23:36
문제 설명
수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.
출력
총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다.
접근
첫번째 풀이떄는 단순하게 루프를 돌릴때마다 합을 구해줬고 오답을 뱉었다. 이후 누적합을 적용해서 쉽게 해결되었다.
https://wikidocs.net/206294 ㄴ 누적합에 대해 쉽게 설명한 위키독스
정답 코드
#include <iostream>
using namespace std;
#define MAX_N 100'001
int N, M;
int arrN[MAX_N];
int dp[MAX_N];
void calculateDp(){
cin >> N >> M;
dp[0] = 0;
for (int i = 1; i <= N; i++)
{
int tmp;
cin >> tmp;
dp[i] = dp[i - 1] + tmp;
}
}
void printResult() {
for (int num = 0; num < M; num++)
{
int i, j;
int result = 0;
cin >> i >> j;
result = dp[j] - dp[i-1];
cout << result << "\n";
}
}
int main() {
FILE* stream;
freopen_s(&stream, "input.txt", "r", stdin);
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
calculateDp();
printResult();
return 0;
}
생각
누적합을 만들때 인덱스를 dp[1] 부터 시작하면 좋다. dp[0] 인덱스부터 채우게 되면 접근할떄 배열 인덱스에 -1 하여 접근하여야 할것이기때문에 여간 불편한게 아닐 것이다. 또한 마지막값부터 첫번째 값까지 누적합을 구할 경우에도 dp[0]=0으로 초기화해두면 기존식 그대로 적용이 가능하다.
주의할점은 최대 배열의 크기를 +1해주어야 하는걸 주의하자