Problem Solving/BOJ

[BOJ] #17144 _ 미세먼지 안녕!

Grini 2019. 10. 22. 20:22

[미세먼지 안녕!] https://www.acmicpc.net/problem/17144

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다. 공기청정기는 항상 왼쪽 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼

www.acmicpc.net

1초동안 일어나는 일을 그대로 구현하면되는 시뮬레이션 문제이다.

 

[ 소스 코드 ]

#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 51

using namespace std;

int dx[] = { -1,1,0,0 }, dy[] = { 0,0,-1,1 };
int R, C, T;
int map[MAX][MAX], air_fresh[2];

void spreadDust();
void operAirFresh();
int getRestDust();
int main() {
	int tmp = 0;

	scanf("%d %d %d", &R, &C, &T);
	for (int i = 1; i <= R; i++) {
		for (int j = 1; j <= C; j++) {
			scanf("%d", &map[i][j]);
			if (map[i][j] == -1) {
				air_fresh[tmp++] = i;
				map[i][j] = 0;
			}
		}
	}

	while (T--) {
		spreadDust();
		operAirFresh();
	}

	printf("%d\n", getRestDust());

	return 0;
}

void spreadDust() {
	int tmp[MAX][MAX] = { 0, };

	for (int i = 1; i <= R; i++) {
		for (int j = 1; j <= C; j++) {
			if (map[i][j] == 0) continue;
			int cnt = 0;
			for (int k = 0; k < 4; k++) {
				int tmp_y = i + dy[k], tmp_x = j + dx[k];
				
				if (tmp_x<1 || tmp_y<1 || tmp_x>C || tmp_y>R) continue;
				if (tmp_x == 1 && tmp_y == air_fresh[0]) continue;
				if (tmp_x == 1 && tmp_y == air_fresh[1]) continue;
				tmp[tmp_y][tmp_x] += (map[i][j] / 5);
				cnt++;
			}
			tmp[i][j] += map[i][j] - (map[i][j] / 5)*cnt;
		}
	}

	memcpy(map, tmp, sizeof(map));
}

void operAirFresh() {
	for (int i = air_fresh[0] - 1; i > 1; i--) map[i][1] = map[i - 1][1];
	for (int i = 1; i < C; i++) map[1][i] = map[1][i + 1];
	for (int i = 1; i < air_fresh[0]; i++) map[i][C] = map[i + 1][C];
	for (int i = C; i > 1; i--) map[air_fresh[0]][i] = map[air_fresh[0]][i - 1];

	for (int i = air_fresh[1] + 1; i <= R; i++) map[i][1] = map[i + 1][1];
	for (int i = 1; i < C; i++) map[R][i] = map[R][i + 1];
	for (int i = R; i > air_fresh[1]; i--) map[i][C] = map[i - 1][C];
	for (int i = C; i > 1; i--) map[air_fresh[1]][i] = map[air_fresh[1]][i - 1];
}

int getRestDust() {
	int result = 0;

	for (int i = 1; i <= R; i++) {
		for (int j = 1; j <= C; j++) {
			if (map[i][j] <= 0) continue;
			result += map[i][j];
		}
	}

	return result;
}