๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[๊ธฐ๋ณธ] ๊ตฌ๊ฐ„ํ•ฉ ์‘์šฉ

by ์„œ์•„๋ž‘๐Ÿ˜ 2025. 3. 13.

 

๋“ค์–ด๊ฐ€๋ฉฐ

๊ตฌ๊ฐ„ํ•ฉ์˜ ์ค‘์š”์„ฑ์„ ๋” ์•Œ์•„๋ณด๊ณ ์ž ๊ตฌ๊ฐ„ํ•ฉ๊ณผ ๊ด€๋ จ๋œ ์‘์šฉ๋ฌธ์ œ๋ฅผ ๋” ํ’€์–ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ง€๋‚œ ๊ตฌ๊ฐ„ํ•ฉ๋ณด๋‹ค๋Š” ์กฐ๊ธˆ ๋” ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ตฌ๊ฐ„ํ•ฉ์„ ๊ตฌํ•ด๋†“๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถฐ์ฃผ๋Š” ์ง€ ์ฒดํฌํ•ด๋ณด๋Š” ์‹œ๊ฐ„์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

๋ฌธ์ œ

๋ฐฑ์ค€ 11660: ๊ตฌ๊ฐ„ํ•ฉ ๊ตฌํ•˜๊ธฐ 5(๋งํฌ)

 

 

ํ’€์ด1

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int size, count;
    cin >> size >> count;

    vector<vector<int>> sumMetrix(size + 1);
    for (int i = 1; i <= size; i++)
    {
        vector<int> numList(size + 1);
        for (int j = 1; j <= size; j++)
        {
            int num;
            cin >> num;
            numList[j] = numList[j-1] + num;
        }

        sumMetrix[i] = numList;
    }

    for (int i = 0; i < count; i++)
    {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;

        int sum = 0;
        for (int j = x1; j <= x2; j++)
            sum += (sumMetrix[j][y2] - sumMetrix[j][y1-1]);

        printf("%d\n", sum);
    }
}

1์ฐจ์› ํ˜•ํƒœ์˜ ๊ฐ€๋กœ(ํ–‰) ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๋ชจ๋‘ ๋จผ์ € ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ธ๋กœ ์˜์—ญ ๊ตฌ๊ฐ„์˜ ์ฐจ์ด๋งŒํผ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ€๋กœ ์˜์—ญ(1์ฐจ์›)์˜ ๊ตฌ๊ฐ„ํ•ฉ์„ ๋”ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •๋‹ต์€ ๋งž์•˜์œผ๋‚˜ ์‹œ๊ฐ„์ด 248ms ์ •๋„ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ๋” ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ ํ’€์ด2(๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•)์œผ๋กœ ํ•œ๋ฒˆ ๋” ํ’€์–ด๋ดค์Šต๋‹ˆ๋‹ค. 

 

 

ํ’€์ด2

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int size, count;
    cin >> size >> count;

    vector<vector<int>> A(size + 1);
    for (int i = 1; i <= size; i++)
    {
        vector<int> numList(size + 1);
        for (int j = 1; j <= size; j++)
            cin >> numList[j];

        A[i] = numList;
    }

    vector<vector<int>> D(size + 1, vector<int>(size + 1));
    for (int i = 1; i <= size; i++)
    {
        for (int j = 1; j <= size; j++)
            D[i][j] = D[i][j-1] + D[i-1][j] - D[i-1][j-1] + A[i][j];
    }

    for (int i = 0; i < count; i++)
    {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        printf("%d\n", D[x2][y2] - D[x1-1][y2] - D[x2][y1-1] + D[x1-1][y1-1]);
    }
}

์ด ํ’€์ด์—์„œ๋Š” ์›๋ณธ ๋ฐฐ์—ด์„ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅ๋ฐ›์•„ ์ €์žฅํ•˜๊ณ , 2์ฐจ์›์˜ ๊ตฌ๊ฐ„ํ•ฉ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๊ฐ„ํ•ฉ ๋ฐฐ์—ด D์˜ i, j ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ณต์‹์€ D[i][j] = D[i][j-1] + D[i-1][j] - D[i-1][j-1] + A[i][j]; ์ž…๋‹ˆ๋‹ค. ๋‚˜๋ฆ„์˜ ๊ณต์‹๊ฐ™์ง€๋งŒ, ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ฐ”๋กœ ์œ„, ์™ผ์ชฝ, ํ•ด๋‹น ๊ฐ’(A[i][j]) ์„ ๋ชจ๋‘ ๋”ํ•˜๊ณ  ์ค‘๋ณต์œผ๋กœ ๋”ํ•ด์ง„ ์œ„+์™ผ์ชฝ ๊ฐ’์„ ๋นผ์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  (x1, y1), (x2, y2) ์˜์—ญ์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ D[x2][y2] - D[x1-1][y2] - D[x2][y1-1] + D[x1-1][y1-1]์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 1,1์—์„œ ํ•ด๋‹น ๊ตฌ๊ฐ„์„ ์ œ์™ธํ•œ ์œ„์ชฝ, ์™ผ์ชฝ์„ ์ œ์™ธ(๋นผ๊ธฐ)ํ•˜๊ณ  ์ค‘๋ณต์œผ๋กœ ๋นผ์ค€ ์œ„+์™ผ์ชฝ ๊ฐ’์„ ๋”ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ’€๋ฉด 120ms๋กœ ์‹œ๊ฐ„์ด ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ํ’€์ด1์˜ ๊ฐ€๋กœ์˜์—ญ ๊ตฌ๊ฐ„ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์ด ํ•œ๋ฒˆ ๋” ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋งŒํผ ๋” ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. ํ’€์ด2์˜ ๋ฐฉ๋ฒ•์ด ๋”์šฑ ์ •์„์ด๋ฉฐ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€