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 |