백준 17144번 : 미세먼지 안녕!

Nitroblue 1·2026년 3월 25일

코딩테스트 준비

목록 보기
74/102
  • sol : 35'33

Learnings

#include <iostream>

#define MAX_R 51
#define MAX_C 51
#define AIRCLEANER -1

using namespace std;

int r, c, t;
int dustGrid[MAX_R][MAX_C];
int tempGrid[MAX_R][MAX_C];

// 하, 상, 우, 좌
int ds[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
int airCleaner[2][2] = { {-1, 1}, {-1, 1} };

void Debug() {
	cout << endl << "DEBUG" << endl;
	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			cout << dustGrid[i][j] << ' ';
		}
		cout << endl;
	}
	cout << "DEBUG FIN" << endl;
}

void Init() {
	cin >> r >> c >> t;

	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			cin >> dustGrid[i][j];
			if (dustGrid[i][j] == AIRCLEANER && airCleaner[0][0] == -1) {
				airCleaner[0][0] = i, airCleaner[1][0] = i + 1;
			}
		}
	}
}

void DupGrid(int from[MAX_R][MAX_C], int to[MAX_R][MAX_C]) {
	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			to[i][j] = from[i][j];
		}
	}
}

bool InGrid(int i, int j) {
	return 1 <= i && i <= r && 1 <= j && j <= c;
}

void Diffuse() {
	DupGrid(dustGrid, tempGrid);

	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			if (dustGrid[i][j] <= 0) continue;
			int diffuseAmount = dustGrid[i][j] / 5;

			for (int d = 0; d < 4; d++) {
				int ni = i + ds[d][0], nj = j + ds[d][1];
				// 공기청정기가 있거나, 칸이 없으면 확산 X
				if (!InGrid(ni, nj) || dustGrid[ni][nj] == AIRCLEANER) continue;

				tempGrid[ni][nj] += diffuseAmount;
				tempGrid[i][j] -= diffuseAmount;
			}
		}
	}

	DupGrid(tempGrid, dustGrid);
}


void AirCleaner() {
	// 좌측
	for (int i = airCleaner[0][0] - 2; i > 0; i--) {
		dustGrid[i + 1][1] = dustGrid[i][1];
	}
	for (int i = airCleaner[1][0] + 2; i <= r; i++) {
		dustGrid[i - 1][1] = dustGrid[i][1];
	}

	// upper-상단, lower-하단
	for (int j = 1; j < c; j++) {
		dustGrid[1][j] = dustGrid[1][j + 1];
		dustGrid[r][j] = dustGrid[r][j + 1];
	}

	// 우측
	for (int i = 1; i < airCleaner[0][0]; i++) {
		dustGrid[i][c] = dustGrid[i + 1][c];
	}
	for (int i = r; i > airCleaner[1][0]; i--) {
		dustGrid[i][c] = dustGrid[i - 1][c];
	}

	// upper - 하단, lower - 상단
	for (int j = c; j > 2; j--) {
		dustGrid[airCleaner[0][0]][j] = dustGrid[airCleaner[0][0]][j - 1];
		dustGrid[airCleaner[1][0]][j] = dustGrid[airCleaner[1][0]][j - 1];
	}
	dustGrid[airCleaner[0][0]][2] = 0;
	dustGrid[airCleaner[1][0]][2] = 0;
}

void GetRemainedDust() {
	int totalDust = 0;
	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			totalDust += dustGrid[i][j];
		}
	}

	cout << totalDust + 2;
}

int main() {
	Init();

	for (int sec = 1; sec <= t; sec++) {
		// 1. Diffuse
		Diffuse();

		// 2. AirCleaner
		AirCleaner();
	}

	GetRemainedDust();

	return 0;
}

0개의 댓글