본문 바로가기
Problem Solving

[BOJ 17144] 미세먼지 안녕!

by Ladun 2020. 3. 25.

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

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다. 공기청정기는 항상 1번 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼

www.acmicpc.net


위 문제는 1초마다 미세먼지가 상하좌우로 확산되고, 공기청정기에서 바람이 나와서 미세먼지를 청소한다.

 

T초가 지났을 때의 미세먼지의 총량을 구하는 문제이다.

 

1. 공기청정기의 위치를 구함.

2. 총 T번 동안 미세먼지를 확산시키고, 공기청정기에서 바람을 내보냄 

     2-1. 임의의 배열을 만들어 미세먼지가 확산되는 정보를 저장하고, 이를 원본 배열에 적용

     2-2. 공기청정기로 바람이 들어오는 부분부터 탐색을 하면서 미세먼지를 이동시킴

3. 맵 전체를 탐색해서 미세먼지의 양을 구함


#include <stdio.h>

int a[51][51];
int R, C, T;

int air[2] = { -1, -1 };

void Update()
{
	int _a[51][51] = { 0, };


	for (int i = 0; i < R; i++)
	{
		for (int j = 0; j < C; j++)
		{
			int l = a[i][j] / 5;
			for (int k = -1; k <= 1; k += 2)
			{
				if (i + k >= 0 && i + k < R && a[i + k][j] != -1)
				{
					_a[i + k][j] += l;
					a[i][j] -= l;
				}
				if (j + k >= 0 && j + k < C && a[i][j + k] != -1)
				{
					_a[i][j + k] += l;
					a[i][j] -= l;
				}
			}
		}
	}
	for (int i = 0; i < R; i++)
	{
		for (int j = 0; j < C; j++)
		{
			a[i][j] += _a[i][j];
		}
	}

	int _x , _y;
	int d[2][4][2] = {
		{{0, -1}, {1, 0}, {0, 1}, {-1, 0}},
		{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
	};

	int _i = 0;
	for (int i = 0; i < 2; i++)
	{
		_x = 0, _y = air[i], _i = 0;
		do
		{
			if (_x + d[i][_i][0] < 0 || _y + d[i][_i][1] < 0 ||
				_x + d[i][_i][0] >= C || _y + d[i][_i][1] >= R || (i == 0 && _y + d[i][_i][1] > air[i]) || (i == 1 && _y + d[i][_i][1] < air[i]))
				_i++;

			if (a[_y][_x] == -1)
				a[_y + d[i][_i][1]][_x + d[i][_i][0]] = 0;
			else
				a[_y][_x] = a[_y + d[i][_i][1]][_x + d[i][_i][0]];
			_x += d[i][_i][0];
			_y += d[i][_i][1];
		} while (a[_y][_x] != -1);

		a[_y - d[i][_i][1]][_x - d[i][_i][0]] = 0;
	}
}

int main(){

	scanf("%d %d %d", &R, &C, &T);

	for (int i = 0; i < R; i++)
		for (int j = 0; j < C; j++)
		{
			scanf("%d", &a[i][j]);
			if (air[0] == -1 && a[i][j] == -1)
			{
				air[0] = i;
				air[1] = i + 1;
			}
		}

	while (T--)
	{
		Update();
	}
	int sum = 0;

	for (int i = 0; i < R; i++)
		for (int j = 0; j < C; j++)
			if(a[i][j] != -1)
				sum += a[i][j];

	printf("%d", sum);
}

'Problem Solving' 카테고리의 다른 글

[BOJ 9465] 스티커  (0) 2020.04.07
[BOJ 2606] 바이러스  (0) 2020.04.07
[BOJ 15685] 드래곤 커브  (0) 2020.03.25
[BOJ 14891] 톱니바퀴  (0) 2020.03.25
[BOJ 2193] 이친수  (0) 2020.01.13