17144번 미세먼지 안녕!

동도리동·2021년 9월 19일
0

코딩테스트

목록 보기
40/76

이 문제는 바로 직전 문제인, 나무 재테크와 닮아있다. 나무가 번식하는 것과 미세먼지가 확산되는 것이 공통점이다.
공기청정기에 대해 처음 생각한 것은
1. 공기청정기의 위치를 어떻게 저장하는 것이 효율적일까? 이다.
이에 대해 => 그냥 x,y로 두고 미세먼지 확산, 공기청정기 실행을 두개로 나눠야 했다. 시뮬레이션 특성상 queue를 굳이 사용할 필요가 없었다. vector로 충분히 구현가능했으며 특히 나무 재테크는 push_back을 이용하였다.

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
int map[51][51];
int b[51][51];
int dx[4] = { 0,-1,0,1 };
int dy[4] = { 1,0,-1,0 };
int r, c, t;
void go(int sx, int sy, int z) {
	int prev = 0;
	int x = sx;
	int y = sy + 1;//공기청정기말고, 그 다음부터 실행해야하니
	int k = 0;
	while (true) {
		if (x == sx && y == sy) break;
		swap(prev, map[x][y]);
		x += dx[k];
		y += dy[k];
		if (x < 0 || x >= r || y < 0 || y >= c) {
			x -= dx[k];
			y -= dy[k];
			k += z;
			k %= 4;
			x += dx[k];
			y += dy[k];
		}
	}
}
int main() {
	//freopen("in1.txt", "rt", stdin);
	cin >> r >> c >> t;
	int x, y;
	//x = y = -1;
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			cin >> map[i][j];
			if (map[i][j]==-1) {
				x = i;
				y = j;
			}
			//cout << map[i][j] << " " ;
		}
		//cout << '\n';
	}
	x -= 1;
	while (t--) {
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				if (map[i][j] <= 0) continue;
				int cnt = 0;
				//if (map[i][j] >= 5) {
					for (int k = 0; k < 4; k++) {
						int xx = i + dx[k];
						int yy = j + dy[k];
						if (xx >= r || xx < 0 || yy >= c || yy <0) continue;
						if(map[xx][yy]>=0)	cnt++;
					}
				//}
				if (cnt > 0) {
					int val = map[i][j] / 5;
					for (int k = 0; k < 4; k++) {
						int xx = i + dx[k];
						int yy = j + dy[k];
						if (xx >= r || xx < 0 || yy >= c || yy < 0) continue;
						if (map[xx][yy] >= 0) b[xx][yy] += val;
					}
					map[i][j] = map[i][j] - cnt * val;
				}
			}
		}
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				if (map[i][j] == -1) continue;
				map[i][j] += b[i][j];
				b[i][j] = 0;
			}
		}
		go(x, y, 1);
		go(x + 1, y, 3);
	}
	int ans = 0;
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			if (map[i][j] >= 0) {
				ans += map[i][j];
			}
		}
	}
	cout << ans << '\n';
	return 0;
}
profile
긍정코딩세상

0개의 댓글

관련 채용 정보