본문 바로가기

알고리즘/백준

백준 17144 미세먼지 안녕!

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

간단하진 않은 구현문제다.

 

문제에 주어진 조건대로 구현하면 된다...

/* 미세먼지 안녕! */

#include <iostream>
#include <queue>

#define MAX_N 50 + 1

using namespace std;

void input();
void solve();

int R, C, T;
int A[50 + 1][50 + 1];
int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,1,0,-1 };

vector<pair<int, int>> air_cleaner;
queue<pair<int, pair<int, int>>> dust;

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

	input(); solve();
	return 0;
}

void input() {
	cin >> R >> C >> T;

	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			cin >> A[i][j];

			if (A[i][j] == -1) {
				air_cleaner.push_back({ i,j }); // 위쪽 좌표를 저장하게 된다.
			}
			else if (A[i][j] != 0) {
				dust.push({ A[i][j], {i,j} });
			}
		}
	}
}

inline bool is_range(int r, int c) {
	return r >= 0 && r < R&& c >= 0 && c < C;
}

inline bool is_air_cleaner(int r, int c) {
	if (r == air_cleaner[0].first && c == air_cleaner[0].second) return true;
	if (r == air_cleaner[1].first && c == air_cleaner[1].second) return true;
	return false;
}

void solve() {

	while (T--) {
		// 미세먼지
		while (!dust.empty()) {
			int val = dust.front().first;
			int rr = dust.front().second.first;
			int cc = dust.front().second.second;

			dust.pop();

			int dir = 0;
			for (int i = 0; i < 4; i++) {
				int nr = rr + dr[i];
				int nc = cc + dc[i];
				
				if (is_range(nr, nc) == true && is_air_cleaner(nr,nc) == false){
					dir++;
					A[nr][nc] += (val / 5);
				}
			}

			A[rr][cc] = A[rr][cc] - val + (val - (val / 5) * dir);
		}

		// 공기청정기 
		int r = air_cleaner[0].first, c = air_cleaner[0].second;
		
		while (c > 0) {
			A[r][c] = A[r][c - 1]; 
			c--;
		}
		while (r > 0) {
			A[r][c] = A[r - 1][c];
			r--;
		}

		while (c < C - 1) {
			A[r][c] = A[r][c + 1];
			c++;
		}

		while (r < air_cleaner[0].first) {
			A[r][c] = A[r + 1][c];
			r++;
		}

		while (c > air_cleaner[0].second + 1) {
			A[r][c] = A[r][c - 1];
			c--;
		}
		A[r][c] = 0;
		// 아래쪽 공기청정기
		r = air_cleaner[1].first, c = air_cleaner[1].second;
		while (r < R - 1) {
			A[r][c] = A[r + 1][c];
			r++;
		}
		while (c < C-1) {
			A[r][c] = A[r][c + 1];
			c++;
		}
		while (r > air_cleaner[1].first) {
			A[r][c] = A[r - 1][c];
			r--;
		}
		while (c > air_cleaner[1].second + 1) {
			A[r][c] = A[r][c - 1];
			c--;
		}
		A[r][c] = 0;
		A[air_cleaner[0].first][air_cleaner[0].second] = -1;
		A[air_cleaner[1].first][air_cleaner[1].second] = -1;

		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {

				if (is_air_cleaner(i, j) == false && A[i][j] != 0) {
					dust.push({ A[i][j], { i,j } });
				}
			}
		}
	}

	int summation = 0;
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {

			if (is_air_cleaner(i,j) == true) continue;
			summation += A[i][j];
		}
	}
	cout << summation;
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 1613 역사  (0) 2020.08.12
백준 5427 불  (0) 2020.08.10
백준 2213 트리의 독립집합  (0) 2020.08.09
백준 7579 앱  (0) 2020.08.07
백준 2352 반도체 설계  (0) 2020.08.06