본문 바로가기
Algorithm

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

by YEON-DU 2020. 8. 24.
반응형

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

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

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

// 미세먼지 안녕!

typedef pair<int, int> point;
int R, C, T;
vector <point> air_clener;
queue <point> que;
int map[51][51];
int cur[51][51];
point dir[4] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

int main() {
    
    cin >> R >> C >> T;
    
    for(int i = 0; i<R; i++)
        for(int j = 0; j<C; j++) {
            cin >> map[i][j];
            
            if(map[i][j] == -1)
                air_clener.push_back({i, j});
            else if(map[i][j] > 0)
                que.push({i, j});
            
        }
    
    for(int time = 0; time<T; time++) {
        
        while(!que.empty()) {
            point p = que.front();
            que.pop();
            int d = 0;
            
            for(int i = 0; i<4; i++) {
                int r = p.first + dir[i].first;
                int c = p.second + dir[i].second;
                
                if(r < 0 || r >= R || c < 0 || c >= C) continue;
                if(map[r][c] == -1) continue;
                
                cur[r][c] = (map[p.first][p.second] / 5) + cur[r][c];
                d++;
            }
            
            cur[p.first][p.second] += map[p.first][p.second] - (map[p.first][p.second] / 5) * d;
            if(cur[p.first][p.second] <= 0)
                cur[p.first][p.second] = 0;
        }
         
        point top = air_clener[0];
        int temp = cur[top.first][C - 1];
        
        // 위 - 오른쪽
        for(int i = C - 1; i > 0; i--)
            cur[top.first][i] = cur[top.first][i - 1];
        
        // 위 - 위쪽
        for(int i = top.first - 1; i >= 0; i--)
            swap(temp, cur[i][C - 1]);
        
        // 위 - 왼쪽
        for(int i = C - 2; i >= 0; i--)
            swap(temp, cur[0][i]);
        
        // 위 - 아래쪽
        for(int i = 1; i < top.first; i++)
            swap(temp, cur[i][0]);
        
        point bottom = air_clener[1];
        temp = cur[bottom.first][C - 1];
        
        // 아래 - 오른쪽
        for(int i = C - 1; i > 0; i--)
            cur[bottom.first][i] = cur[bottom.first][i - 1];
        
        // 아래 - 아래쪽
        for(int i = bottom.first + 1; i < R; i++)
            swap(temp, cur[i][C - 1]);
        
        // 아래 - 왼쪽
        for(int i = C - 2; i >= 0; i--)
            swap(temp, cur[R - 1][i]);
        
        // 아래 - 위쪽
        for(int i = R - 2; i > bottom.first; i--)
            swap(temp, cur[i][0]);
        
        memset(map, 0, sizeof(map));
        map[air_clener[0].first][air_clener[0].second] = -1;
        map[air_clener[1].first][air_clener[1].second] = -1;
        
        for(int i = 0; i<R; i++)
            for(int j = 0; j<C; j++)
                if(map[i][j] != -1) {
                    map[i][j] = cur[i][j];
                    if(map[i][j] > 0)
                        que.push({i, j});
                }
        
        memset(cur, 0, sizeof(cur));
    }
    
    int answer = 0;
    for(int i = 0; i<R; i++) {
        for(int j = 0; j<C; j++)
            if(map[i][j] != -1)
                answer += map[i][j];
    }
    
    cout << answer << endl;
    return 0;
}
반응형

'Algorithm' 카테고리의 다른 글

[백준 16985] Maaaaaaaaaze  (0) 2020.09.06
git commit 수정하기 관련  (0) 2020.08.30
[백준 14503] 로봇 청소기  (0) 2020.08.23
[백준 16000] 섬  (0) 2020.08.08
[백준 19236] 청소년 상어  (0) 2020.07.30

댓글