๋ฐ์—”์œผ๋กœ ์„ฑ์žฅ์ค‘ ๐ŸŒฑ

์•Œ๊ณ ๋ฆฌ์ฆ˜/[๋ฐฑ์ค€]

BOJ_14929 : ๊ท€์ฐฎ์•„ (SIB) (C++)

์จ๋ฐ 2023. 2. 14. 23:59

ํ’€์ด ๋ฐฉ๋ฒ•

 

n ์ด 10๋งŒ๊นŒ์ง€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์ค‘ for ๋ฌธ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

์ฃผ์–ด์ง„ ์‹์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์ธ๋ฐ, ์‹์„ ์ดํ•ดํ•ด๋ณด๋ฉด

 

x1x2 + x1x3 + x2x3

= x1(x2+x3) + x2(x3)

= x1(x2~xN๊นŒ์ง€์˜ ํ•ฉ) + x2(x3~xN๊นŒ์ง€์˜ ํ•ฉ)

 

x1x2 + x1x3 + x1x4 + x2x3 + x2x4 + x3x4

= x1(x2+x3+x4) + x2(x3+x4) + x3(x4)

= x1(x2~xN๊นŒ์ง€์˜ ํ•ฉ) + x2(x3~xN๊นŒ์ง€์˜ ํ•ฉ) + x3(x3~xN๊นŒ์ง€์˜ ํ•ฉ)

 

์ด๋ ‡๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทœ์น™์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰, ๋ˆ„์ ํ•ฉ(prefix sum)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ’€์ดํ•˜๋ฉด ๋œ๋‹ค.

 

์ฃผ์˜ํ•  ์ ์€ int ํ˜•์œผ๋กœ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ์•ˆ๋˜๊ณ  long long ํ˜•์œผ๋กœ ์ €์žฅํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

(int๋กœ ์ €์žฅํ•˜๋ฉด 20%์—์„œ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.)

 

 

์ฝ”๋“œ

 

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstring>
#include <stack>
#include <queue>
#include <limits.h>
#include <regex>
#include <sstream>
#include <tuple>
using namespace std;

int main() {

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    // ๋‹จ์ˆœํ•œ ์ˆ˜ํ•™์‹ ๊ตฌํ˜„ ๋ฌธ์ œ
    // ๊ณฑ์˜ ๋ˆ„์ ํ•ฉ

    // -2 + 3 - 6 = -5

    // ๋‘ ๊ฐœ์”ฉ ๊ณฑํ•˜๊ณ  ๋‹ค ๋”ํ•จ

    // n์ด 10๋งŒ๊นŒ์ง€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์œ ์˜

    // x1x2 + x1x3 + x2x3
    // = x1(x2+x3) + x2x3

    int n;
    cin >> n;

    vector <long long> arr(n+1);
    vector <long long> ps(n+1); // ๋ˆ„์ ํ•ฉ prefix sum ์‚ฌ์šฉ

    for(int i = 1; i <= n; i++){
        cin >> arr[i];
        ps[i] = ps[i-1] + arr[i];
    }

    long long ans = 0;

    for(int i = 2; i <= n; i++){
        ans += arr[i] * ps[i-1];
    }

    cout << ans << "\n";

    return 0;
}