본문 바로가기

PS

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

[ 문제 ]

 

17144번: 미세먼지 안녕!

 

[ 접근방법 ]

 

크게 2파트(미세먼지 확산, 공기청정기 작동)로 나누어서 구현을 하였다.

b 배열에 작업을 진행한 뒤 결과를 a 배열에 적용하였다.

 

[ 소스코드 ]

 

#include <iostream>

using namespace std;

int r, c, t, a[55][55], b[55][55], airCleaner;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};

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

    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){
                airCleaner = i;
            }
            b[i][j] = a[i][j];
        }
    }

    for(int i = 0; i < t; i++){
        // 미세먼지 확산
        for(int j = 0; j < r; j++){
            for(int k = 0; k < c; k++){
                if(a[j][k] > 0){
                    int cnt = 0;
                    for(int l = 0; l < 4; l++){
                        int x = j + dx[l];
                        int y = k + dy[l];
                        if(x >= 0 && x < r && y >= 0 && y < c && a[x][y] != -1){
                            b[x][y] += a[j][k] / 5;
                            cnt++;
                        }
                    }
                    b[j][k] -= (a[j][k] / 5) * cnt;
                }
            }
        }

        // 공기청정기 작동
        for(int j = airCleaner - 1; j > 0; j--){
            b[j][0] = b[j - 1][0];
        }
        for(int j = 0; j < c - 1; j++){
            b[0][j] = b[0][j + 1];
        }
        for(int j = 0; j < airCleaner - 1; j++){
            b[j][c - 1] = b[j + 1][c - 1];
        }
        for(int j = c - 1; j > 0; j--){
            b[airCleaner - 1][j] = b[airCleaner - 1][j - 1];
        }
        b[airCleaner - 1][0] = -1;
        b[airCleaner - 1][1] = 0;

        for(int j = airCleaner; j < r - 1; j++){
            b[j][0] = b[j + 1][0];
        }
        for(int j = 0; j < c - 1; j++){
            b[r - 1][j] = b[r - 1][j + 1];
        }
        for(int j = r - 1; j > airCleaner; j--){
            b[j][c - 1] = b[j - 1][c - 1];
        }
        for(int j = c - 1; j > 0; j--){
            b[airCleaner][j] = b[airCleaner][j - 1];
        }
        b[airCleaner][0] = -1;
        b[airCleaner][1] = 0;

        // a 배열 갱신
        for(int j = 0; j < r; j++){
            for(int k = 0; k < c; k++){
                a[j][k] = b[j][k];
            }
        }
    }

    int ans = 0;
    for(int i = 0; i < r; i++){
        for(int j = 0; j < c; j++){
            if(a[i][j] > 0){
                ans += a[i][j];
            }
        }
    }
    cout << ans;

    return 0;
}

'PS' 카테고리의 다른 글

[ 백준 / C++ ] 14938 : 서강그라운드  (0) 2025.04.15
[ 백준 / C++ ] 2240 : 자두나무  (0) 2025.04.09
[ 백준 / C++ ] 2251 : 물통  (0) 2025.04.01
[ 백준 / C++ ] 1251 : 단어 나누기  (0) 2025.03.27
[ 백준 / C++ ] 4358 : 생태학  (0) 2025.03.26