알고리즘/백준

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

KANTAM 2023. 10. 2. 00:54

문제

풀이

  • 미세먼지는 동시에 확산 하므로 확산했을 때의 변화값을 의미하는 배열을 하나 더 선언한다. 
  • 확산 시, 소스가 되는 미세먼지는 상하좌우로 확산된 수에 비례한다. 
  • 공기 청정기에 의한 순환은 for문으로 아래와 위 공기 청정기 각각의 방향에 따라 설정하였다. 

코드

#include <iostream>

using namespace std;

int room[51][51];
int room_dif[51][51];
int move_x[4] = { 0, 0, 1, -1 };
int move_y[4] = { 1, -1, 0, 0 };
int airConUp = -1;
int airConDown = -1;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int R, C, T;
    int answer = 0;

    cin >> R >> C >> T;

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

            if (room[i][j] == -1 && airConUp == -1)
            {
                airConUp = i;
                airConDown = i + 1;
            }
        }
    }

    while (T--)
    {
        // 미세먼지 확산
        for (int i = 0; i < R; ++i)
        {
            for (int j = 0; j < C; ++j)
            {
                if (room[i][j] == -1 || room[i][j] == 0 || room[i][j] / 5 == 0)
                {
                    continue;
                }

                int diffuse_count = 0;
                for (int k = 0; k < 4; ++k)
                {
                    int next_x = i + move_x[k];
                    int next_y = j + move_y[k];
                    if (next_x >= 0 && next_y >= 0 && next_x < R && next_y < C && room[next_x][next_y] != -1)
                    {
                        room_dif[next_x][next_y] += (room[i][j] / 5);
                        diffuse_count++;
                    }
                }

                room_dif[i][j] -= (diffuse_count * (room[i][j] / 5));
            }
        }

        for (int i = 0; i < R; ++i)
        {
            for (int j = 0; j < C; ++j)
            {
                room[i][j] += room_dif[i][j];
                room_dif[i][j] = 0;
            }
        }

        // 공기청정기 순환
        for (int i = airConUp - 1; i > 0; --i)
        {
            room[i][0] = room[i - 1][0];
        }
        for (int i = 0; i < C - 1; ++i)
        {
            room[0][i] = room[0][i + 1];
        }
        for (int i = 0; i < airConUp; ++i)
        {
            room[i][C - 1] = room[i + 1][C - 1];
        }
        for (int i = C - 1; i > 0; --i)
        {
            if (i == 1)
            {
                room[airConUp][1] = 0;
                continue;
            }
            room[airConUp][i] = room[airConUp][i - 1];
        }

        for (int i = airConDown + 1; i < R - 1; ++i)
        {
            room[i][0] = room[i + 1][0];
        }
        for (int i = 0; i < C - 1; ++i)
        {
            room[R - 1][i] = room[R - 1][i + 1];
        }
        for (int i = R - 1; i > airConDown; --i)
        {
            room[i][C - 1] = room[i - 1][C - 1];
        }
        for (int i = C - 1; i > 0; --i)
        {
            if (i == 1)
            {
                room[airConDown][1] = 0;
                continue;
            }
            room[airConDown][i] = room[airConDown][i - 1];
        }

    }

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

    cout << answer;

    return 0;
}