๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœจ Algorithm

[๋ฐฑ์ค€/C++] 2015๋ฒˆ : ์ˆ˜๋“ค์˜ ํ•ฉ 4

by nitronium102 2021. 9. 12.

๋ฌธ์ œ

A[1], A[2], ..., A[N]์˜ N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด์ด ์žˆ๋‹ค. ์ด ๋ฐฐ์—ด A์˜ ๋ถ€๋ถ„ํ•ฉ์ด๋ž€ 1 ≤ i ≤ j ≤ N์ธ ์ •์ˆ˜ i์™€ j์— ๋Œ€ํ•ด A[i]๋ถ€ํ„ฐ A[j]๊นŒ์ง€์˜ ํ•ฉ์„ ๋งํ•œ๋‹ค.

N๊ณผ A[1], A[2], ..., A[N]์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋Ÿฌํ•œ N×(N+1)/2๊ฐœ์˜ ๋ถ€๋ถ„ํ•ฉ ์ค‘ ํ•ฉ์ด K์ธ ๊ฒƒ์ด ๋ช‡ ๊ฐœ๋‚˜ ์žˆ๋Š”์ง€๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ N๊ณผ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 200,000, |K| ≤ 2,000,000,000) N๊ณผ K ์‚ฌ์ด์—๋Š” ๋นˆ์นธ์ด ํ•˜๋‚˜ ์žˆ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๋ฐฐ์—ด A๋ฅผ ์ด๋ฃจ๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  A[1], A[2], ..., A[N]์˜ ์ˆœ์„œ๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ์ •์ˆ˜์˜ ์ ˆ๋Œ“๊ฐ’์€ 10,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ•ฉ์ด K์ธ ๋ถ€๋ถ„ํ•ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

01. ์ผ๋‹จ ์ž๋ฃŒํ˜•์— ์œ ์˜ํ•˜์ž.

- ๋ถ€๋ถ„ํ•ฉ ๊ฐœ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์ด 2,000,000,000 * (2,000,000,000 + 1) / 2 ์ด๋ฏ€๋กœ long long์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

- ๊ฒฐ๊ณผ๊ฐ’์˜ ์ตœ๋Œ“๊ฐ’์€ ๋ถ€๋ถ„ํ•ฉ ๊ฐœ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ ์—ญ์‹œ long long์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

02. ๊ฐ๊ฐ์˜ ๋ถ€๋ถ„ํ•ฉ์„ ์ €์žฅํ•œ๋‹ค(p_sum)

 

03. 1~n๊นŒ์ง€ i๋ฅผ ๋Œ๋ฉด์„œ sum[i] - sum[j] = k๋ฅผ ๋งŒ์กฑํ•˜๋Š” j๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. 

๋ฌธ์ œ์—์„œ๋Š” 1<i<j<n์œผ๋กœ ๋˜์–ด์žˆ์ง€๋งŒ ํ’€์ด ๊ณผ์ •์—์„œ๋Š” i๋ž‘ j๋ฅผ ๊ตฌ๋ถ„ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— (1<j<i<n)์œผ๋กœ ๋ฐ”๊ฟ”์ผ๋‹ค.

- sum[j] = sum[i] - k

 

04. sum[i]๊ฐ’์„ map์— ๋„ฃ์–ด์ค€๋‹ค. 

map์€ ๋ถ€๋ถ„ํ•ฉ์˜ ๋นˆ๋„๋ฅผ ์ €์žฅํ•œ๋‹ค. (key : ๋ถ€๋ถ„ํ•ฉ, value : ๋นˆ๋„)

- ๋งŒ์•ฝ sum[j]๊ฐ€ map์— ์กด์žฌํ•˜๋ฉด ans๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ค€๋‹ค.

- p_sum[i]๊ฐ€ k์ธ ๊ฒฝ์šฐ, j๊ฐ€ 0์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— map[0] = 1์„ ํ‘œ์‹œํ•ด์ค€๋‹ค.

 

#include <iostream>
#include <map>
using namespace std;
int p_sum[200001];

int main(){
    int n, k, num;
    cin >> n >> k;
    map<int, long long> m; // ๋ถ€๋ถ„ํ•ฉ ๊ฐœ์ˆ˜ : 2000000000*(2000000000+1)/2

    long long cnt = 0;
    m[0] = 1; // p_sum[i]๊ฐ€ k์ธ ๊ฒฝ์šฐ, j=0์ด ๋  ์ˆ˜ ์žˆ์Œ

    for (int i=1; i<=n; i++){
        cin >> num;
        // 01. ๊ฐ๊ฐ์˜ ๋ถ€๋ถ„ํ•ฉ์„ ์ €์žฅ
        p_sum[i] = p_sum[i-1] + num;
        // * 1~n๊นŒ์ง€ i๋ฅผ ๋Œ๋ฉด์„œ sum[i] - sum[j] = k๋ฅผ ๋งŒ์กฑํ•˜๋Š” j๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ(i>=j๋ผ๊ณ  ๊ฐ€์ •! - ๋ฌธ์ œ์™€ ๊ธฐํ˜ธ ๋‹ค๋ฅด๊ฒŒ ์จ๋„ ์ƒ๊ด€X)
        // ๋งŒ์•ฝ ์กด์žฌํ•˜๋ฉด ans++;
        // sum[j] = sum[i] - k
        cnt += m[p_sum[i] - k];
        // 02. map์— ์ €์žฅ
        m[p_sum[i]]++;
    }
    cout << cnt;
}

์ด ๋ฌธ์ œ๋Š” ์ดํ•ด๋ฅผ ๋ชปํ•ด์„œ ๋„ˆ๋ฌด ์–ด๋ ค์› ๋‹ค. ํŠนํžˆ ๋‹ค ํ’€์—ˆ๋Š”๋ฐ p_sum[i]๊ฐ€ k์ธ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•ด์„œ ์ž๊พธ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค.

๋Œ“๊ธ€