시간 복잡도를 생각하지 않고 (알고리즘을 생각하지 않고) 직관적인 로직을 구현했다.
#include <iostream>
using namespace std;
int main()
{
int N, M;
cin >> N >> M;
int array[100001] = {};
for (int i = 0; i < N; i++)
{
cin >> array[i];
}
for (int j = 0; j < M; j++)
{
int min, max;
cin >> min >> max;
int sum = 0;
for (int i = min - 1; i <= max - 1; i++)
{
sum += array[i];
}
cout << sum << endl;
}
return 0;
}
N, M 이 1 부터 시작하므로 배열의 index와 맞춰주기 위해 min과 max에 -1을 추가했다.
그 후 이중 반복문으로 구간의 합을 구했고 출력하는 로직을 완성했다.
<시간 제한: 1초> <데이터 크기: 100,000>
그러나 이중 반복문으로 시간 복잡도는 (O(n^2))이므로 O(100,000^2) = 10,000,000,000
즉 100억 > 1억 이므로 매우 비효율 적인 로직이라는 것을 알 수 있다.
따라서 시간 복잡도를 획기적으로 줄일 수 있는 로직을 찾아야 한다.
구간 합 알고리즘을 사용하기로 한다.
아이디어: 구간 합 배열을 만들어 시간 복잡도를 획기적으로 줄인다.
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
int S[100001] = {};
for (int i = 1; i <= N; i++)
{
int temp;
cin >> temp;
S[i] = S[i - 1] + temp;
}
for (int i = 0; i < M; i++)
{
int min, max;
cin >> min >> max;
cout << S[max] - S[min - 1] << "\n";
}
return 0;
}
이렇게 작성하면 시간 복잡도를 줄일 수 있기 때문에 문제를 해결할 수 있다.
계속 시간 초과가 발생해서 여러 블로그를 보니 맨 처음 false와 null로 버퍼를 지우는 과정을 생략하여 속도를 빨라지게 한다고 나와있다. (이 처리를 하지 않으면 아무리 빠른 로직을 사용해도 통과가 되지 않는다..)
또한 마지막에 \n가 아닌 endl 를 사용하면 시간 초과가 발생한다.. 아마 endl 가 포함한 기능들 때문일 것이다..
'백준 알고리즘 with C++' 카테고리의 다른 글
알고리즘 시간 복잡도 (0) | 2023.12.15 |
---|---|
[1546] 평균 with C++/Cpp (0) | 2023.12.14 |
[11720] 숫자의 합 with C++/Cpp (0) | 2023.12.14 |