미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다.
공기청정기는 항상 1번 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼지가 있고, (r, c)에 있는 미세먼지의 양은 Ar,c이다.
1초 동안 아래 적힌 일이 순서대로 일어난다.
미세먼지가 확산된다. 확산은 미세먼지가 있는 모든 칸에서 동시에 일어난다.
(r, c)에 있는 미세먼지는 인접한 네 방향으로 확산된다.
인접한 방향에 공기청정기가 있거나, 칸이 없으면 그 방향으로는 확산이 일어나지 않는다.
확산되는 양은 Ar,c/5이고 소수점은 버린다.
(r, c)에 남은 미세먼지의 양은 Ar,c - (Ar,c/5)×(확산된 방향의 개수) 이다.
usingnamespacestd; constint MAX = 50; int a[MAX][MAX]; int tmp[MAX][MAX]; // 한번에 확산이 이루어지게 하기 위해 사용할 임시 배열
int dx[] = { 1, -1, 0, 0 }; int dy[] = { 0, 0, 1, -1 }; int r, c, t; vector<int> cleaner; // 공기청정기 위치
voidprint(){ // 출력 함수 cout << '\n'; for (int x = 0; x < r; x++) { for (int y = 0; y < c; y++) { cout << a[x][y] << ' '; } cout << '\n'; } cout << '\n'; } voidwind(){ // 위칸 공기청정기 동작 for (int i = cleaner[0] - 1; i > 0; i--) { // 0열 아래로 이동 a[i][0] = a[i - 1][0]; } for (int i = 0; i < c - 1; i++) { // 0행 왼쪽으로 이동 a[0][i] = a[0][i + 1]; } for (int i = 0; i < cleaner[0]; i++) { // c - 1열 위로 이동 a[i][c - 1] = a[i + 1][c - 1]; } for (int i = c - 1; i > 1; i--) { // 공기청정기 윗부분 행 오른쪽으로 이동 a[cleaner[0]][i] = a[cleaner[0]][i - 1]; } a[cleaner[0]][1] = 0;
// 아래칸 공기청정기 동작 for (int i = cleaner[1] + 1; i < r - 1; i++) { // 0열 위로 이동 a[i][0] = a[i + 1][0]; } for (int i = 0; i < c - 1; i++) { // r - 1행 왼쪽으로 이동 a[r - 1][i] = a[r - 1][i + 1]; } for (int i = r - 1; i > cleaner[1]; i--) { // c - 1열 아래로 이동 a[i][c - 1] = a[i - 1][c - 1]; } for (int i = c - 1; i > 1; i--) { // 공기청정기 아랫부분 행 오른쪽으로 이동 a[cleaner[1]][i] = a[cleaner[1]][i - 1]; } a[cleaner[1]][1] = 0; }
voidspread(){ // 미세먼지 확산 for (int x = 0; x < r; x++) { for (int y = 0; y < c; y++) { if (a[x][y] > 0) { int sum = 0; for (int k = 0; k < 4; k++) { int nx = x + dx[k]; int ny = y + dy[k];
if (nx < 0 || ny < 0 || nx >= r || ny >= c) continue; if (a[nx][ny] == -1) continue;
tmp[nx][ny] += a[x][y] / 5; sum += a[x][y] / 5;
} a[x][y] -= sum; // 확산된 양만큼 빼줌 } } }
for (int x = 0; x < r; x++) { for (int y = 0; y < c; y++) { a[x][y] += tmp[x][y]; // 확산된 양을 한번에 더해줌 tmp[x][y] = 0; // tmp 초기화 } }
for (int i = 0; i < r; i++) for (int j = 0; j < c; j++) { cin >> a[i][j]; if (a[i][j] == -1) cleaner.push_back(i); // 공기 청정기 위치 저장 } while (t--) { spread(); // 확산 wind(); // 이동 }
int ans = 0; for(int i =0; i < r; i++) for (int j = 0; j < c; j++) { ans += a[i][j]; } ans += 2; // 공기 청정기 제거