본문 바로가기

백준

C++ [백준]17144번 미세먼지 안녕!

https://www.acmicpc.net/problem/17144

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

 

솔루션


3차원 배열을 선언을 해서 [2][R][C]를 통해서 확산이 된 후 배열을 [0][R][C]->[1][R][C] 또는 [1][R][C]->[0][R][C]로

바꿔 주고, while문을 통해서 공기 청정기를 순환을 시켜줬습니다!

 

그리고 바꾼 배열은 모두 다 0으로 다시 초기화를 해 주고 그 다음 T일 때를 연산결과를 넣어줍니다!

 

 

코드


#include <iostream>
using namespace std;

int arr[2][51][51];
int R, C, T;

int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
int cyclex, cycley;

void cycleMachine(int idx) {
	
    //윗 부분 순환 
	int tx = cyclex-1;
	int ty = cycley;
	int sum = 0;
	while (tx > 0) {
		arr[idx][tx][ty] = arr[idx][tx - 1][ty];
		tx--;
	}
	while (ty < C-1) {
		arr[idx][tx][ty] = arr[idx][tx][ty + 1];
		ty++;
	}
	while (tx < cyclex) {
		arr[idx][tx][ty] = arr[idx][tx + 1][ty];
		tx++;
	}
	while (ty > 0) {
		if (arr[idx][tx][ty - 1] == -1) {
			arr[idx][tx][ty] = 0;
			break;
		}
		arr[idx][tx][ty] = arr[idx][tx][ty - 1];
		ty--;
	}
    //아랫부분 순환.
	tx = cyclex + 2;
 	ty = cycley;
	while (tx < R - 1) {
		arr[idx][tx][ty] = arr[idx][tx + 1][ty];
		tx++;
	}
	while (ty < C - 1) {
		arr[idx][tx][ty] = arr[idx][tx][ty + 1];
		ty++;
	}
	while (tx > cyclex + 1) {
		arr[idx][tx][ty] = arr[idx][tx - 1][ty];
		tx--;
	}
	while (ty > 0) {
		if (arr[idx][tx][ty - 1] == -1) {
			arr[idx][tx][ty] = 0;
			break;
		}
		arr[idx][tx][ty] = arr[idx][tx][ty - 1];
		ty--;
	}
	return;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> R >> C >> T;

	bool is_visit = false;
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			cin >> arr[0][i][j];
			if (arr[0][i][j] == -1) {
				arr[1][i][j] = -1;
                //공기 청정기의
                //위쪽 인덱스를 기준으로 잡음.
				if (is_visit) continue;
				is_visit = true;
				cyclex = i;
				cycley = j;
			}
		}
	}
	bool idx = false;
	while (T--) {
		idx = !idx;
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if ((arr[!idx][i][j]) == 0 || arr[!idx][i][j] == -1) continue;
				int div = arr[!idx][i][j] / 5;
				int cnt = 0;
				for (int k = 0; k < 4; k++) {
					if (i + dx[k] >= 0 && i + dx[k]<R) {
						if (j + dy[k] >= 0 && j + dy[k] < C) {
							if (arr[idx][i + dx[k]][j + dy[k]] != -1) {
								//범위 안이고,
								// 공기 청정기 아니면,
                                //먼지 옮겨주기,
								arr[idx][i + dx[k]][j + dy[k]] += div;
								cnt++;
							}
						}
					}
				}//확산 된 양 만큼 먼지 뺴 주기,
				arr[!idx][i][j] -= (div * cnt);
			}
		}
		//다 확산이 끝났으면,
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if (arr[!idx][i][j] == -1) continue;
				arr[idx][i][j] += arr[!idx][i][j];
				arr[!idx][i][j] = 0;
			}
		}//옮긴 먼지 다시 0으로 만들기,

		//그리고 미세먼지 순환 시키기,
		cycleMachine(idx);
	}
    
    //그리고 합계 구하기.
	int sum = 0;
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			if (arr[idx][i][j] == -1)continue;
			sum += arr[idx][i][j];
		}
	}
	cout << sum << "\n";
}

'백준' 카테고리의 다른 글

C++ [백준]1967번 트리의 지름  (0) 2022.04.07
C++ [백준] 13549번 숨바꼭질3  (0) 2022.04.07
C++ [백준]10868번 최솟값  (0) 2022.04.07
C++ [백준]15657번 N과 M(8)  (0) 2022.04.05
C++ [백준]1504번 특정한 최단 경로  (0) 2022.04.05