끄적끄적 코딩
article thumbnail
728x90

시뮬레이션 문제입니다.

미세먼지를 확산시키고, 공기청정기를 통해 바람을 확산시키는 과정을 T번 반복합니다.
반복한 상태에서의 미세먼지의 총량을 출력하는 문제입니다.

미세먼지는 상하좌우 방향으로 N/5만큼 퍼져나갑니다.
그리고 퍼져나간 양만큼 원래 있던 곳의 미세먼지의 양이 줄어듭니다.

이를 위해서 map과 같은 크기의 2차원 배열을 하나 만들어서
미세먼지의 변화량을 저장한 뒤 한번에 변경해주었습니다.

그리고 공기청정기를 통해서 해당하는 방향으로 움직이게 해주었으며,
모든 과정이 끝나면 미세먼지량을 세준 뒤 출력합니다.

 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <string>
using namespace std;

int moveX[4] = { 0, 1, 0, -1 };
int moveY[4] = { 1, 0, -1, 0 };

int main(int argc, char *argv[])
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int R, C, T;
	int num;
	int map[60][60];
	int cal[60][60];
	vector<pair<int, int> > v;
	queue<pair<int, int> >q;

	memset(map, -1, sizeof(map));

	cin >> R >> C >> T;

	for (int i = 1; i <= R; ++i) {
		for (int j = 1; j <= C; ++j) {
			cin >> num;
			map[i][j] = num;
			if (num == -1) {
				v.push_back({ i, j });
			}
			else if (num > 0) {
				q.push({ i, j });
			}
		}
	}

	int c = 0;
	while (c < T) {
		memset(cal, 0, sizeof(cal));

		while(!q.empty()){
			int queueY = q.front().first;
			int queueX = q.front().second;
			q.pop();

			int count = 0;

			for (int i = 0; i < 4; ++i) {
				int nextX = queueX + moveX[i];
				int nextY = queueY + moveY[i];

				if (map[nextY][nextX] != -1) {
					++count;
					cal[nextY][nextX] += map[queueY][queueX] / 5;
				}
			}
			int sub = map[queueY][queueX] / 5;
			cal[queueY][queueX] -=  sub * count;
		}

		for (int i = 1; i <= R; ++i) {
			for (int j = 1; j <= C; ++j) {
				if (cal[i][j] != 0) {
					map[i][j] += cal[i][j];
				}
			}
		}

		int airY = v[0].first;
		int airX = v[0].second;

		++airX;
		int temp = 0;
		int prev = 0;
		while (1) {
			if (map[airY][airX] == -1) {
				--airX;
				--airY;
				break;
			}
			temp = map[airY][airX];
			map[airY][airX] = prev;
			prev = temp;

			++airX;
		}
		while (1) {
			if (map[airY][airX] == -1) {
				++airY;
				--airX;
				break;
			}
			temp = map[airY][airX];
			map[airY][airX] = prev;
			prev = temp;

			--airY;
		}
		while (1) {
			if (map[airY][airX] == -1) {
				++airX;
				++airY;
				break;
			}
			temp = map[airY][airX];
			map[airY][airX] = prev;
			prev = temp;

			--airX;
		}
		while (1) {
			if (map[airY][airX] == -1) {
				--airY;
				break;
			}
			temp = map[airY][airX];
			map[airY][airX] = prev;
			prev = temp;

			++airY;
		}

		airY = v[1].first;
		airX = v[1].second;
		prev = 0;
		temp = 0;

		++airX;
		while (1) {
			if (map[airY][airX] == -1) {
				--airX;
				++airY;
				break;
			}
			temp = map[airY][airX];
			map[airY][airX] = prev;
			prev = temp;

			++airX;
		}
		while (1) {
			if (map[airY][airX] == -1) {
				--airY;
				--airX;
				break;
			}
			temp = map[airY][airX];
			map[airY][airX] = prev;
			prev = temp;

			++airY;
		}
		while (1) {
			if (map[airY][airX] == -1) {
				++airX;
				--airY;
				break;
			}
			temp = map[airY][airX];
			map[airY][airX] = prev;
			prev = temp;

			--airX;
		}
		while (1) {
			if (map[airY][airX] == -1) {
				++airY;
				break;
			}
			temp = map[airY][airX];
			map[airY][airX] = prev;
			prev = temp;

			--airY;
		}

		for (int i = 1; i <= R; ++i) {
			for (int j = 1; j <= C; ++j) {
				if (map[i][j] > 0) {
					q.push({ i, j });
				}
			}
		}

		++c;
	}

	int result = 0;
	for (int i = 1; i <= R; ++i) {
		for (int j = 1; j <= C; ++j) {
			if (map[i][j] != -1) {
				result += map[i][j];
			}
		}
	}

	cout << result << endl;

	return 0;
}

검색 태그