๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 5549 : ํ–‰์„ฑ ํƒ์‚ฌ (๋ˆ„์ ํ•ฉ) / ์‚ฝ์งˆ ๊ธฐ๋ก

728x90

https://www.acmicpc.net/problem/5549

๋ฌธ์ œ

์ƒ๊ทผ์ด๋Š” ์šฐ์ฃผ์„ ์„ ํƒ€๊ณ  ์ธ๊ฐ„์ด ๊ฑฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰์„ฑ์„ ์ฐพ๊ณ  ์žˆ๋‹ค. ๋งˆ์นจ๋‚ด, ์ „ ์„ธ๊ณ„ ์ตœ์ดˆ๋กœ ์ธ๊ฐ„์ด ๊ฑฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰์„ฑ์„ ์ฐพ์•˜๋‹ค. ์ด ํ–‰์„ฑ์€ ์ •๊ธ€, ๋ฐ”๋‹ค, ์–ผ์Œ์ด ๋’ค์–ฝํžŒ ํ–‰์„ฑ์ด๋‹ค. ์ƒ๊ทผ์ด๋Š” ์ด ํ–‰์„ฑ์—์„œ ๊ฑฐ์ฃผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์—ญ์˜ ์ง€๋„๋ฅผ ๋งŒ๋“ค์–ด ์ง€๊ตฌ๋กœ ๋ณด๋ƒˆ๋‹ค.

์ƒ๊ทผ์ด๊ฐ€ ๋ณด๋‚ด์˜จ ์ง€๋„๋Š” ๊ฐ€๋กœ Ncm, ์„ธ๋กœ Mcm ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๋‹ค. ์ง€๋„๋Š” 1cm ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๊ณ , ๊ฐ ๊ตฌ์—ญ์˜ ์ง€ํ˜•์ด ์•ŒํŒŒ๋ฒณ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. ์ง€ํ˜•์€ ์ •๊ธ€, ๋ฐ”๋‹ค, ์–ผ์Œ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ์ •๊ธ€์€ J, ๋ฐ”๋‹ค๋Š” O, ์–ผ์Œ์€ I๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค.

์ง€๊ตฌ์— ์žˆ๋Š” ์ •์ธ์ด๋Š” ์กฐ์‚ฌ ๋Œ€์ƒ ์˜์—ญ์„ K๊ฐœ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด๋•Œ, ๊ฐ ์˜์—ญ์— ์ •๊ธ€, ๋ฐ”๋‹ค, ์–ผ์Œ์ด ๊ฐ๊ฐ ๋ช‡ ๊ฐœ์”ฉ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ง€๋„์˜ ํฌ๊ธฐ M๊ณผ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ M, N ≤ 1000)

๋‘˜์งธ ์ค„์— ์ •์ธ์ด๊ฐ€ ๋งŒ๋“  ์กฐ์‚ฌ ๋Œ€์ƒ ์˜์—ญ์˜ ๊ฐœ์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ K ≤ 100000)

์…‹์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ ์ค„์—๋Š” ์ƒ๊ทผ์ด๊ฐ€ ๋ณด๋‚ธ ์ง€๋„์˜ ๋‚ด์šฉ์ด ์ฃผ์–ด์ง„๋‹ค.

๋‹ค์Œ K๊ฐœ ์ค„์—๋Š” ์กฐ์‚ฌ ๋Œ€์ƒ ์˜์—ญ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ •๋ณด๋Š” ๋„ค ์ •์ˆ˜ a b c d๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ตฌ์—ญ์€ ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘ ์ด๋ฉฐ, ์™ผ์ชฝ ์œ„ ๋ชจ์„œ๋ฆฌ์˜ ์ขŒํ‘œ๊ฐ€ (a, b) ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๋ชจ์„œ๋ฆฌ์˜ ์ขŒํ‘œ๊ฐ€ (c, d)์ด๋‹ค.

์ถœ๋ ฅ

๊ฐ ์กฐ์‚ฌ ๋Œ€์ƒ ์˜์—ญ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ •๊ธ€, ๋ฐ”๋‹ค, ์–ผ์Œ์˜ ์ˆ˜๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ํ•œ ์ค„์— ํ•œ ์ •๋ณด์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.


 

๊ณจ๋“œ 5 ๋ˆ„์ ํ•ฉ ๋ฌธ์ œ

๊ต‰์žฅํ•œ ๋…ธ๊ฐ€๋‹ค๊ฐ€ ํ•„์š”ํ•œ ๋ฌธ์ œ์ด๋‹ค.

์ „์ฒด ํ’€์ด ์ฝ”๋“œ๋Š” ๋งจ ์•„๋ž˜์— ์žˆ์Œ

 

ํ’€๋‹ค๊ฐ€ ์‹ค์ˆ˜๋ฅผ ํ•˜๋‚˜ ํ–ˆ๋‹ค.

 

            if(map[i][j]=='J') presum[i][j][0]=1;
            if(map[i][j]=='O') presum[i][j][1]=1;
            if(map[i][j]=='I') presum[i][j][2]=1;
            presum[i][j][0] += (presum[i-1][j][0]+presum[i][j-1][0]);
            presum[i][j][1] += (presum[i-1][j][1]+presum[i][j-1][1]);
            presum[i][j][2] += (presum[i-1][j][2]+presum[i][j-1][2]);

 

๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•  ๋•Œ

์œ„์ฒ˜๋Ÿผ [i-1][ ]๊ณผ [ ][j-1] ๋ฅผ ๋”ํ•ด์„œ ๋ˆ„์ ๊ฐ’์„ ๊ตฌํ•ด์ฃผ๋‹ˆ๊นŒ presum[ ][ ][0] ์„ ์ถœ๋ ฅํ–ˆ์„ ๋•Œ ๋น„์ •์ƒ์ ์œผ๋กœ ํฐ ๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

137? ์ด๋ผ๋‹ˆ ๋‚ด๊ฐ€ ์›ํ•œ๊ฑด ์ด๊ฒŒ ์•„๋‹Œ๋ฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž˜๋ชป ์งฐ๋‹ค

J๊ฐ€ 137๊ฐœ์š”,..??

์ƒ๊ฐํ•ด๋ดค๋”๋‹ˆ, ๊ทธ๋ƒฅ ์ด์ „ ๊ฐ’ ๋‘๊ฐœ๋ฅผ ๋”ํ•˜๋ฉด ์•ˆ๋˜๊ณ 

[i-1][ ]๊ณผ [ ][j-1] ๋ฅผ ๋”ํ•ด์ค€ ํ›„ [i-1][j-1] ๊ฐ’์„ ๋นผ์ค˜์•ผ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’์ด ๋‚˜์˜ด.

๊ทธ๋ž˜์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆ˜์ •ํ–ˆ๋”๋‹ˆ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์ด ๋‚˜์™”๋‹ค!

 

            if(map[i][j]=='J') presum[i][j][0]=1;
            if(map[i][j]=='O') presum[i][j][1]=1;
            if(map[i][j]=='I') presum[i][j][2]=1;
            presum[i][j][0] += (presum[i-1][j][0]+presum[i][j-1][0]-presum[i-1][j-1][0]);
            presum[i][j][1] += (presum[i-1][j][1]+presum[i][j-1][1]-presum[i-1][j-1][1]);
            presum[i][j][2] += (presum[i-1][j][2]+presum[i][j-1][2]-presum[i-1][j-1][2]);

 

์ถœ๋ ฅ์—๋„ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ผ๋‹จ ๋‚œ ์ธ๋ฑ์Šค๋ฅผ 0๋ถ€ํ„ฐ ๊ณ ๋ คํ–ˆ์œผ๋ฏ€๋กœ ์‹ค์ œ ์ž…๋ ฅ๋ฐ›์€ ์ขŒํ‘œ์—์„œ ๊ฐ’์„ 1์”ฉ ๋นผ๊ณ  ์—ฐ์‚ฐํ–ˆ๋‹ค.

์ข€ ์ด์ƒํ•œ๊ฒŒ.. ์ธ๋ฑ์Šค๋ฅผ 0๋ถ€ํ„ฐ ์„ค์ •ํ•˜๋‹ˆ๊นŒ ํ‹€๋ฆฌ๊ณ  1๋ถ€ํ„ฐ ์—ฐ์‚ฐ๋˜๋„๋ก ์ˆ˜์ •ํ•˜๋‹ˆ๊นŒ ๋งž์•˜์Œ. ์™œ์ง€?

์ž…๋ ฅ๋ฐ›๊ณ  1์”ฉ ๋นผ๋Š” ์—ฐ์‚ฐ์ด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋˜๋‚˜.....ํ์Œ

 

์จŒ๋“  ์ƒ๊ฐํ•˜๊ธฐ ๊ท€์ฐฎ์œผ๋‹ˆ ๊ทธ๋ƒฅ ์ง€๋„ ์ž…๋ ฅ & presum ๊ณ„์‚ฐ ์‹œ ์ธ๋ฑ์Šค๋ฅผ 1๋ถ€ํ„ฐ ๊ณ ๋ คํ•˜๋ฉด ๋จ.

 

์ž…๋ ฅ๊ฐ’์ด 3, 5, 4, 7 ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ๋ฒ”์œ„๊ฐ€ ์•„๋ž˜ ํ‘œ์˜ ๋นจ๊ฐ„ ๋ถ€๋ถ„๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ

์ „์ฒด ํ‘œ์—์„œ (4,4)๊นŒ์ง€์˜ ์˜์—ญ๊ณผ (2,7)๊นŒ์ง€์˜ ์˜์—ญ์„ ๋นผ์ค˜์•ผ ํ•œ๋‹ค. 

 

๋จผ์ € (4,4)๋ฅผ ๋นผ๋ฉด ์•„๋ž˜์˜ ๋…ธ๋ž€ ๋ถ€๋ถ„์„ ์ง€์šฐ๋Š” ์…ˆ์ด๋‹ค

 

์ธ๋ฑ์Šค 1 2 3 4 5 6 7
1 (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7)
2 (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7)
3 (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7)
4 (4,1) (4,2) (4,3) (4,4) (4,5) (4,6) (4,7)

 

๊ทธ๋ฆฌ๊ณ  (2,7)์„ ๋นผ๋ฉด ์•„๋ž˜์˜ ํŒŒ๋ž€ ๋ถ€๋ถ„ ์˜์—ญ์„ ์ง€์šฐ๋Š” ์…ˆ์ด๋‹ค.

์ธ๋ฑ์Šค 1 2 3 4 5 6 7
1 (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7)
2 (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7)
3 (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7)
4 (4,1) (4,2) (4,3) (4,4) (4,5) (4,6) (4,7)

 

๊ทผ๋ฐ ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์˜ ์—ฐ๋‘์ƒ‰ ์˜์—ญ์ด 2๋ฒˆ ๋น ์ง€๊ฒŒ ๋˜๋ฏ€๋กœ, ์ด ์˜์—ญ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋” ๋”ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ธ๋ฑ์Šค 1 2 3 4 5 6 7
1 (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7)
2 (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7)
3 (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7)
4 (4,1) (4,2) (4,3) (4,4) (4,5) (4,6) (4,7)

 

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ถœ๋ ฅ ์—ฐ์‚ฐ์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

 

cout << presum[c][d][0] - presum[a - 1][d][0] - presum[c][b - 1][0] + presum[a - 1][b - 1][0] << " ";
cout << presum[c][d][1] - presum[a-1][d][1] - presum[c][b-1][1] + presum[a-1][b-1][1] << " ";
cout << presum[c][d][2] - presum[a-1][d][2] - presum[c][b-1][2] + presum[a-1][b-1][2]<< '\n';

 

 

 

๋‚˜์˜ ํ’€์ด

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

string mapinput;
char map[1001][1001];
int ks[4] = {0};
int presum[1001][1001][3]={0};
int m;
int n;
int k;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int a;
    int b;
    int c;
    int d;

    cin >> m >> n >> k;
    for (int i = 1; i <= m;++i){
        cin >> mapinput;
        for (int j = 1; j <= n; ++j){
            map[i][j] = mapinput[j-1];
        }
    }
    // ์ •๊ธ€์€ J, ๋ฐ”๋‹ค๋Š” O, ์–ผ์Œ์€ I, ๊ฐฏ์ˆ˜ ๋ฏธ๋ฆฌ ๊ตฌํ•ด๋†“๊ธฐ
    // ์„ธ๋กœ 1์—ด ๋จผ์ € ์ฑ„์šฐ๊ธฐ
    for (int i = 1; i <= m;++i){
        if(map[i][1]=='J') presum[i][1][0]=1;
        else if(map[i][1]=='O') presum[i][1][1]=1;
        else if(map[i][1]=='I') presum[i][1][2]=1;
        presum[i][1][0] += presum[i-1][1][0];
        presum[i][1][1] += presum[i-1][1][1];
        presum[i][1][2] += presum[i-1][1][2];
    }
    // ๊ฐ€๋กœ 1์—ด ๋จผ์ € ์ฑ„์šฐ๊ธฐ
    for (int i = 2; i <= n;++i){
        if(map[1][i]=='J') presum[1][i][0]=1;
        else if(map[1][i]=='O') presum[1][i][1]=1;
        else if(map[1][i]=='I') presum[1][i][2]=1;
        presum[1][i][0] += presum[1][i-1][0];
        presum[1][i][1] += presum[1][i-1][1];
        presum[1][i][2] += presum[1][i-1][2];
    }
    // ๋‚˜๋จธ์ง€ ์ฑ„์šฐ๊ธฐ
    for (int i = 2; i <= m;++i){
        for (int j = 2; j <= n;++j){
            presum[i][j][0] += (presum[i-1][j][0]+presum[i][j-1][0]-presum[i-1][j-1][0]);
            presum[i][j][1] += (presum[i-1][j][1]+presum[i][j-1][1]-presum[i-1][j-1][1]);
            presum[i][j][2] += (presum[i-1][j][2]+presum[i][j-1][2]-presum[i-1][j-1][2]);
            if(map[i][j]=='J') presum[i][j][0]+=1;
            else if(map[i][j]=='O') presum[i][j][1]+=1;
            else if(map[i][j]=='I') presum[i][j][2]+=1;
        }
    }

    for (int i = 0; i < k; ++i){
        cin >> a >> b >> c >> d;
        int jungle = presum[c][d][0] - presum[a - 1][d][0] - presum[c][b - 1][0] + presum[a - 1][b - 1][0];
        int ocean = presum[c][d][1] - presum[a - 1][d][1] - presum[c][b - 1][1] + presum[a - 1][b - 1][1];
        int ice = presum[c][d][2] - presum[a - 1][d][2] - presum[c][b - 1][2] + presum[a - 1][b - 1][2];
        cout << jungle << ' ' << ocean << ' ' << ice << '\n';
    }
}

 

728x90