문제
N과 N개의 배열이 주어질 때 위의 식 결과 구하기
생각할 것
- 그냥 2중 for문을 이용하여 계산하면 시간초과가 발생한다.
- for문 하나를 줄일 수 있는 방법을 생각해보면
- x1x2 + x1x3 + x1xn = x1(x2 + x3 + xn)의 공식을 이용하면 된다!
- 그리고 더해지는 수는 누적합과 구간합을 이용해 계산하면 된다.
코드
시간복잡도 O(N)
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N;
cin >> N;
vector<int> vec(N + 1);
vector<int> sum(N + 1);
for (int i = 1; i <= N; i++) {
cin >> vec[i];
sum[i] = sum[i - 1] + vec[i];
}
long long res = 0;
for (int i = 1; i < N; i++) {
res += vec[i] * (sum[N] - sum[i]); // xi(xn + xn-1 + ... + xi+2 + xi+1)
}
cout << res;
return 0;
}
시간복잡도 O(N^2) - 시간 초과
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N;
cin >> N;
vector<int> vec(N);
for (int i = 0; i < N; i++) {
cin >> vec[i];
}
long long res = 0;
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
res += vec[i] * vec[j];
}
}
cout << res;
return 0;
}
반응형
'Problem solving > BOJ' 카테고리의 다른 글
[BOJ] 16172. 나는 친구가 적다 (Large) (C++) (0) | 2023.08.06 |
---|---|
[BOJ] 16916. 부분 문자열 (C++) (0) | 2023.08.04 |
[BOJ] 1005. ACM Craft (C++) (0) | 2023.07.31 |
[BOJ] 1774. 우주신과의 교감 (C++) (0) | 2023.07.28 |