[구현] 백준 17144 미세먼지 안녕!

2021. 3. 16. 12:01알고리즘 문제분석

 

www.acmicpc.net/problem/17144

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

수행 시간: 3시간

 

골드 5수준의 삼성SW 기출이였던걸로 기억한다. 공기청정기의 위치좌표를 저장해주고 그 좌표를 통해 구현해주면 어렵지 않은 문제였다.

 

#include <iostream>
#include <queue>
using namespace std;
int r, c, t; //r은 세로 c는 가로 t는 경과시간
int room[7][51];
int tmp_room[7][51];
int dx[4] = { 0,0,-1,1 };
int dy[4] = { 1,-1,0,0 };
int up_air, down_air;
int total;

void expend() {
	for (int i = 0;i < r;i++) {
		for (int j = 0;j < c;j++) {
			int now_dust = room[i][j];
			int dust_size = (int)(room[i][j] / 5);
			int dust_cnt = 0;
			for (int k = 0;k < 4;k++) {
				int nx = dx[k] + i;
				int ny = dy[k] + j;
				if (nx > r || nx <= 0 || ny > c || ny <= 0) { //벽
					continue;
				}
				if (room[nx][ny] == -1) { //공기청정기
					continue;
				}
				dust_cnt++;
				tmp_room[nx][ny] += dust_size; //임시 룸에 더해줌
			}
			room[i][j] = now_dust - dust_size * dust_cnt; //원래 룸에 저장
		}
	}
	for (int i = 0;i < r;i++) {
		for (int j = 0;j < c;j++) {
			room[i][j] += tmp_room[i][j];
			tmp_room[i][j] = 0;
		}
	}
}

void air() {
	total -= room[up_air - 1][0];
	total -= room[down_air + 1][0];
	for (int i = 2;i <= c - 1;i++) { //아래
		room[up_air][i] = room[up_air][i - 1];
	}
	for (int i = up_air-1; i >=0 ;i--) { //오른쪽
		room[i - 1][c - 1] = room[i][c - 1];
	}
	for (int i =c-2;i >=0;i--) { // 위
		room[0][i] = room[0][i + 1];
	}
	for (int i = 1; i <up_air-1;i++) { // 왼쪽
		room[i][0] = room[i - 1][0];
	}
	room[up_air][1] = 0;
	
	for (int i = 2;i <=c-1;i++) { //위
		room[down_air][i] = room[down_air][i - 1];
	}
	for (int i = down_air+1;i <=r-1;i++) { // 오른쪽
		room[i][c - 1] = room[i - 1][c - 1];
	}
	for (int i = c-2;i >=0;i--) { //아래
		room[r - 1][i] = room[r - 1][i + 1];
	}
	for (int i = r-2; i < down_air+1;i--) { //왼쪽
		room[i][0] = room[i + 1][0];
	}
	room[down_air][1] = 0;
}

int main() {
	int e = 0;
	cin >> r >> c >> t;
	for (int i = 0; i < r;i++) {
		for (int j = 0;j < c;j++) {
			cin >> room[i][j];
			if (room[i][j] == -1 && e == 0) {
				up_air = i;
				e++;
			}
			else if (room[i][j] == -1 && e == 1) {
				down_air = i;
			}
			else
				total += room[i][j];
		}
	}
	for (int i = 1;i <= t;i++) {
		expend();
		air();
	}
	cout << total;
}