백준/코테문제집
[백준] 구간 합 구하기4(11659)
2zreal
2025. 1. 16. 16:08
수가 주어졌을 때 i번째 수부터 j번째 수까지 합을 구하는 문제이다.
입력으로 N과 M이 10만까지 주어지기 때문에 O(n^2)으로는 문제를 해결할 수 없다.
매번 더하는 방식으로는 문제를 해결하지 못한다.
그럼 어떻게 해결을 해야 하는 것인가?
미리 더해놓음으로써 매번 더하는 작업을 없앨 수 있다. (arr[i]+=arr[i-1])
입력을 받는 동시에 미리 더한다.
5 9 12 14 15
이렇게 더한 후 만약 2 3 이 입력으로 들어오면 2 이전에 값은 필요가 없어지니 12-5=7을 출력하면 된다.
i부터 j까지의 합을 얻으려면 i 이전에 값을 제거해 주는 작업이 꼭 필요하다. (arr[j]-arr[i-1])
그리고 출력하는 작업이 많다 보니 출력으로 인한 시간초과를 피하기 위해
ios::sync_with_stdio(false);
cin.tie(NULL);
이 부분을 추가해줘야 한다.
그리고 줄 바꿈은 endl대신 '\n'을 사용해 준다.
#include <iostream>
using namespace std;
int arr[100001];
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
int N = 0;
int M = 0;
cin >> N>>M;
for (int i = 1; i <= N; i++)
{
cin >> arr[i];
arr[i] += arr[i - 1];
}
for (int i = 0; i < M; i++)
{
int num1 = 0;
int num2 = 0;
cin >> num1 >> num2;
cout << arr[num2] - arr[num1 - 1]<<'\n';
}
return 0;
}