본문 바로가기

백준

백준5549 - 행성 탐사

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