하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 5549 행성 탐사 C++

긤효중 2022. 9. 27. 00:09

상근이는 우주선을 타고 인간이 거주할 수 있는 행성을 찾고 있다. 마침내, 전 세계 최초로 인간이 거주할 수 있는 행성을 찾았다. 이 행성은 정글, 바다, 얼음이 뒤얽힌 행성이다. 상근이는 이 행성에서 거주 할 수 있는 구역의 지도를 만들어 지구로 보냈다.

상근이가 보내온 지도는 가로 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)이다.


출력

각 조사 대상 영역에 포함되어 있는 정글, 바다, 얼음의 수를 공백으로 구분해 한 줄에 한 정보씩 출력한다.


힌트

두 번째 조사 대상 영역에는 정글(J)이 3개, 바다(O)가 5개, 얼음(I)이 2개 있다.

 

2차원 누적합으로 I,J,O에 대해 각각 배열을 만들고 계산해주었습니다.

#include <iostream>
#include <algorithm>
using namespace std;
int n,m,k;

int map_J[1001][1001];
int map_I[1001][1001];
int map_O[1001][1001];

void init(){
    cin >> n >> m;
    cin >> k;
    
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            char c;
            cin >> c;
            if(c == 'J'){
                map_J[i][j] = 1;
            }
            else if(c == 'I'){
                map_I[i][j] = 1;
            }
            else if(c == 'O'){
                map_O[i][j] = 1;
            }
        }
    }
}

void psum_calculate_J(){
    
    int dp[1001][1001] = {0, };

    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + map_J[i][j];
            map_J[i][j] = dp[i][j];
        }
    }
}

void psum_calculate_I(){
    int dp[1001][1001] = {0, };
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + map_I[i][j];
            map_I[i][j] = dp[i][j];
        }
    }
}

void psum_calculate_O(){
    int dp[1001][1001] = {0, };
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + map_O[i][j];
            map_O[i][j] = dp[i][j];
        }
    }
}

int main(void){
    init();
    psum_calculate_J();
    psum_calculate_I();
    psum_calculate_O();
    
    for(int i = 0;i<k;i++){
        int x,y,x2,y2;
        scanf("%d %d %d %d",&x,&y,&x2,&y2);
        int diff_J = map_J[x2][y2] - map_J[x2][y-1] - map_J[x-1][y2] + map_J[x-1][y-1];
        int diff_O = map_O[x2][y2] - map_O[x2][y-1] - map_O[x-1][y2] + map_O[x-1][y-1];
        int diff_I = map_I[x2][y2] - map_I[x2][y-1] - map_I[x-1][y2] + map_I[x-1][y-1];
        printf("%d %d %d \n",diff_J,diff_O,diff_I);
    }
}

'알고리즘' 카테고리의 다른 글

백준 16234 인구 이동 C++  (2) 2022.09.28
백준 18511 C++ 큰 수 구성하기  (0) 2022.09.28
다익스트라-알고리즘  (0) 2022.09.19
백준 2023 신기한 소수 C++  (0) 2022.08.26
백준 10571 다이아몬드 C++  (0) 2022.08.25