본문 바로가기
Problem solving/BOJ

[BOJ] 14929. 귀찮아 (SIB)

by 겸 2023. 8. 1.

문제

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;
}
반응형