www.acmicpc.net/problem/17144

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

미세먼지 확산 구현보다 공기청정기 순환을 구현하는 것이 생각보다 까다로웠던 문제이다.

 

미세먼지 확산의 경우 임시적으로 맵을 한개 더 만들고 확산값을 저장한 후 기존의 값에 다시 더해주는 형식으로 구현하였다.

 

공기청정기 바람 순환은 위쪽 4개 + 아래쪽 4개를 각각 포문을 사용하여 구현하였으며 임시값 두개를 사용해 값을 교환해주면서 진행하였으며 각각의 범위를 정하는 것이 까다로워서 시간이 오래걸렸다.

 

공기청정기 구현만 조심하면 어려운 문제는 아니었던 것 같다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int R, C, T, ans;
int map1[51][51];
int map2[51][51];
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
pair<int, int> ac;

void spread() {
	int tmp = 0;
	int cnt = 0;
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			if (map1[i][j] >= 5) {
				tmp = map1[i][j] / 5;
				for (int k = 0; k < 4; k++) {
					int nx = i + dx[k];
					int ny = j + dy[k];
					if (nx >= 0 && ny >= 0 && nx < R 
						&& ny < C && map1[nx][ny] != -1) {
						cnt++;
						map2[nx][ny] += tmp;
					}
				}
				map1[i][j] -= tmp * cnt;
			}
			tmp = 0;
			cnt = 0;
		}
	}
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			map1[i][j] += map2[i][j];
			map2[i][j] = 0;
		}
	}
	return;
}

void rotate() {
	int tmp = 0, tmp2 = 0;
	int x = ac.first;
	tmp = map1[x][1];
	map1[x][1] = 0;
	for (int i = 2; i < C; i++) {
		tmp2 = map1[x][i];
		map1[x][i] = tmp;
		tmp = tmp2;
	}
	for (int i = x-1; i >= 0; i--) {
		tmp2 = map1[i][C - 1];
		map1[i][C - 1] = tmp;
		tmp = tmp2;
	}
	for (int i = C - 2; i >= 0; i--) {
		tmp2 = map1[0][i];
		map1[0][i] = tmp;
		tmp = tmp2;
	}
	for (int i = 1; i < x; i++) {
		tmp2 = map1[i][0];
		map1[i][0] = tmp;
		tmp = tmp2;
	}
	x += 1;
	tmp = 0, tmp2 = 0;
	tmp = map1[x][1];
	map1[x][1] = 0;
	for (int i = 2; i < C; i++) {
		tmp2 = map1[x][i];
		map1[x][i] = tmp;
		tmp = tmp2;
	}
	for (int i = x + 1; i <= R - 1; i++) {
		tmp2 = map1[i][C - 1];
		map1[i][C - 1] = tmp;
		tmp = tmp2;
	}
	for (int i = C - 2; i >= 0; i--) {
		tmp2 = map1[R - 1][i];
		map1[R - 1][i] = tmp;
		tmp = tmp2;
	}
	for (int i = R - 2; i > x; i--) {
		tmp2 = map1[i][0];
		map1[i][0] = tmp;
		tmp = tmp2;
	}
	return;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int check = 0;
	cin >> R >> C >> T;
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			cin >> map1[i][j];
			if (map1[i][j] == -1 && check == 0) {
				check = 1;
				ac.first = i;
			}
		}
	}
	while (T--) {
		spread();
		rotate();
	}
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			if (map1[i][j] > 0) {
				ans += map1[i][j];
			}
		}
	}
	cout << ans;
	return 0;
}

+ Recent posts