본문 바로가기

code/BOJ

백준 17144 미세먼지 안녕!

문제 링크:

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

코드:

/* 1. -1(공기청정기)일 경우에도 skip해야 */
/* 2. 공기청정기는 따로 copy해야 */
/* 3. loop 초기화에 이전 loop 탈출 조건 보정 필요*/
/* 4. r은 갱신 중이므로 탈출 조건에 원본인 prf[0] 사용할 것 */
/* 5. 인덱싱 잘 해라 제발, 배열 넘어가면 런타임 에러 발생, rotation부 안 되면 나머지 주석처리하고 표적 디버깅 */

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int R, C, T;
int map[2][50][50];
bool mi;
vector<int> prf;
int nr, nc;
int buf[200], b;
int ans;

int dr[] = { -1, 0, 1, 0 };
int dc[] = { 0, 1, 0, -1 };

#define IN(r, c) (0 <= (r) && (r) < R && 0 <= (c) && (c) < C)
#define L(x) for (int i = 0; i < (x); ++i)

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> R >> C >> T;
	for (int r = 0; r < R; ++r) {
		for (int c = 0; c < C; ++c) {
			cin >> map[0][r][c];
			if (map[0][r][c] == -1)
				prf.push_back(r);
		}
	}

	for (int t = 0; t < T; ++t) {
		
		for (int r = 0; r < R; ++r)
			fill(map[!mi][r], map[!mi][r] + C, 0);

		for (int r = 0; r < R; ++r) {
			for (int c = 0; c < C; ++c) {
				if (map[mi][r][c] > 0) {	/* 1 */
					map[!mi][r][c] += map[mi][r][c];
					for (int d = 0; d < 4; ++d) {
						nr = r + dr[d], nc = c + dc[d];
						if (IN(nr, nc) && map[mi][nr][nc] != -1) {
							map[!mi][nr][nc] += map[mi][r][c] / 5;
							map[!mi][r][c] -= map[mi][r][c] / 5;
						}
					}
				}
			}
		}

		map[!mi][prf[0]][0] = -1;	/* 2 */
		map[!mi][prf[1]][0] = -1;	/* 2 */
		mi = !mi;

		int r = prf[0], c = 1; b = 0;
		L(C - 2) buf[b++] = map[mi][r][c++];	/* 3 */
		L(prf[0]) buf[b++] = map[mi][r--][c];
		L(C - 1) buf[b++] = map[mi][r][c--];
		L(prf[0]) buf[b++] = map[mi][r++][c];

		rotate(buf, buf + b - 1, buf + b);

		buf[0] = 0;
		r = prf[0], c = 1; b = 0;
		L(C - 2) map[mi][r][c++] = buf[b++];	/* 3 */
		L(prf[0]) map[mi][r--][c] = buf[b++];	/* 4 */
		L(C - 1) map[mi][r][c--] = buf[b++];
		L(prf[0]) map[mi][r++][c] = buf[b++];	/* 4 */

		r = prf[1], c = 1; b = 0;
		L(C - 2) buf[b++] = map[mi][r][c++];	/* 3 */
		L(R - prf[1] - 1) buf[b++] = map[mi][r++][c];
		L(C - 1) buf[b++] = map[mi][r][c--];
		L(R - prf[1] - 1) buf[b++] = map[mi][r--][c];

		rotate(buf, buf + b - 1, buf + b);

		buf[0] = 0;
		r = prf[1], c = 1; b = 0;
		L(C - 2) map[mi][r][c++] = buf[b++];	/* 3 */
		L(R - prf[1] - 1) map[mi][r++][c] = buf[b++];
		L(C - 1) map[mi][r][c--] = buf[b++];
		L(R - prf[1] - 1) map[mi][r--][c] = buf[b++];
	}

	for (int r = 0; r < R; ++r) 
		for (int c = 0; c < C; ++c) 
			ans += map[mi][r][c];

	cout << ans + 2;
	return 0;
}