https://www.acmicpc.net/problem/5549
5549번: 행성 탐사
문제 상근이는 우주선을 타고 인간이 거주할 수 있는 행성을 찾고 있다. 마침내, 전 세계 최초로 인간이 거주할 수 있는 행성을 찾았다. 이 행성은 정글, 바다, 얼음이 뒤얽힌 행성이다. 상근이는 이 행성에서 거주 할 수 있는 구역의 지도를 만들어 지구로 보냈다. 상근이가 보내온 지도는 가로 Ncm, 세로 Mcm 직사각형 모양이다. 지도는 1cm 크기의 정사각형으로 나누어져 있고, 각 구역의 지형이 알파벳으로 표시되어 있다. 지형은 정글, 바다, 얼음 중
www.acmicpc.net
처음에 bfs로 풀었다가 시간초과나서 dp로 푼 문제이다. 문제에서 시작하는 점과 끝나는 점을 주었고 오른쪽과 아래로만 이동하면서 풀면 되는 문제이기 때문에 굳이 bfs로 풀지 않고 dp로 해결할 수가 있었다. 구간합을 이용하여 풀었다.
앞으로 두 방향으로 이동하게 정해준 면적 구하기 문제는 dp로 해결해야겠다.
#include <iostream>
using namespace std;
char mat[1001][1001];
int cntJ[1001][1001] = { 0, };
int cntO[1001][1001] = { 0, };
int cntI[1001][1001] = { 0, };
int n, m, o;
int a, b, c, d;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
cin >> o;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> mat[i][j];
if (mat[i][j] == 'J') { //1,1에서 시작하여 현재 i, j까지 직사각형 모양으로 존재하는 J의 갯수
cntJ[i][j] = cntJ[i - 1][j] + cntJ[i][j - 1] - cntJ[i - 1][j - 1] + 1;
cntO[i][j] = cntO[i - 1][j] + cntO[i][j - 1] - cntO[i - 1][j - 1];
cntI[i][j] = cntI[i - 1][j] + cntI[i][j - 1] - cntI[i - 1][j - 1];
}
else if (mat[i][j] == 'O') { //1,1에서 시작하여 현재 i, j까지 직사각형 모양으로 존재하는 O의 갯수
cntJ[i][j] = cntJ[i - 1][j] + cntJ[i][j - 1] - cntJ[i - 1][j - 1];
cntO[i][j] = cntO[i - 1][j] + cntO[i][j - 1] - cntO[i - 1][j - 1] + 1;
cntI[i][j] = cntI[i - 1][j] + cntI[i][j - 1] - cntI[i - 1][j - 1];
}
else { //1,1에서 시작하여 현재 i, j까지 직사각형 모양으로 존재하는 I의 갯수
cntJ[i][j] = cntJ[i - 1][j] + cntJ[i][j - 1] - cntJ[i - 1][j - 1];
cntO[i][j] = cntO[i - 1][j] + cntO[i][j - 1] - cntO[i - 1][j - 1];
cntI[i][j] = cntI[i - 1][j] + cntI[i][j - 1] - cntI[i - 1][j - 1] + 1;
}
}
}
//구간합으로 구한 결과중 1, 1에서 n, m까지의 결과를 4부분으로 나누어 답을 구한다.
for (int i = 0; i < o; i++) {
cin >> a >> b >> c >> d;
cout << cntJ[c][d] - cntJ[c][b - 1] - cntJ[a - 1][d] + cntJ[a - 1][b - 1] << ' ';
cout << cntO[c][d] - cntO[c][b - 1] - cntO[a - 1][d] + cntO[a - 1][b - 1] << ' ';
cout << cntI[c][d] - cntI[c][b - 1] - cntI[a - 1][d] + cntI[a - 1][b - 1] << '\n';
}
}
'백준' 카테고리의 다른 글
백준9251 - LCS (0) | 2020.02.02 |
---|---|
백준2294 - 동전2 (0) | 2020.02.01 |
백준1912 - 연속합 (0) | 2020.01.31 |
백준10844 - 쉬운 계단 수 (0) | 2020.01.30 |
백준2565 - 전깃줄 (0) | 2020.01.28 |