반응형

문제 링크

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

 

풀이 )

  미세먼지 확산 전 격자판을 a 배열에 저장하고, 변화량을 b 배열에 저장했다. (a 배열에 모두 저장하는 경우, 변화가 순차적으로 일어나는게 아니기 때문에 불가능했다.)

  b 배열의 경우 확산이 일어날 수 있는 방향(벽이 아니고, 공기청정기가 아닌 방향)의 개수에 따라 각 방향에 1/5에 해당되는 값을 더해주고, 해당 칸의 값에 1/5를 빼주었다.

  이후 공기청정기의 윗부분 순환과 아랫부분 순환을 구현해준 후, 마지막으로 모든 칸의 미세먼지 양을 더해준다.

  

#include <iostream>
#include <cstring>

using namespace std;

int r, c, t;
int cx1, cx2;
int a[50][50];
int b[50][50];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

void diffu(int x, int y){
    for(int i = 0; i < 4; ++i){
        int xx = x+dx[i];
        int yy = y+dy[i];
        if(xx < 0 || xx >= r || yy < 0 || yy >= c)
            continue;
        if((xx == cx1 || xx == cx2) && yy == 0)
            continue;
        b[xx][yy] += a[x][y]/5;
        b[x][y] -= a[x][y]/5;
    }
}

void airCleaner1(int cx){
    for(int i = cx-1; i > 0; --i){
        if(cx == 1)
            break;
        a[i][0] = a[i-1][0];
    }
    for(int i = 0; i < c-1; ++i)
        a[0][i] = a[0][i+1];
    for(int i = 0; i < cx; ++i)
        a[i][c-1] = a[i+1][c-1];
    for(int i = c-1; i > 1; --i)
        a[cx][i] = a[cx][i-1];
    a[cx][1] = 0;
}

void airCleaner2(int cx){
    for(int i = cx+1; i < r-1; ++i){
        if(cx == r-2)
            break;
        a[i][0] = a[i+1][0];
    }
    for(int i = 0; i < c-1; ++i)
        a[r-1][i] = a[r-1][i+1];
    for(int i = r-1; i > cx; --i)
        a[i][c-1] = a[i-1][c-1];
    for(int i = c-1; i > 1; --i)
        a[cx][i] = a[cx][i-1];
    a[cx][1] = 0;
}

int main(void){
    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 && a[i-1][j] == -1){
                cx1 = i-1;
                cx2 = i;
            }
        }

    while(t--){
        memset(b, 0, sizeof(b));
        for(int i = 0; i < r; ++i)
            for(int j = 0; j < c; ++j)
                if(a[i][j])
                    diffu(i, j);
        for(int i = 0; i < r; ++i)
            for(int j = 0; j < c; ++j)
                a[i][j] += b[i][j];
        airCleaner1(cx1);
        airCleaner2(cx2);
    }

    int ans = 0;
    for(int i = 0; i < r; ++i)
        for(int j = 0; j < c; ++j)
            if(a[i][j] != -1)
                ans += a[i][j];

    cout << ans << '\n';
}

 

주의 )

  순환 시 4방향에 따른 반복문 내 반복 횟수

반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 9663 : N-Queen  (0) 2020.12.09
[C++] 백준 - 1065 : 한수  (0) 2020.12.07
[C++] 백준 - 14499 : 주사위 굴리기  (0) 2020.12.05
[C++] 백준 - 1874 : 스택 수열  (0) 2020.12.01
[C++] 백준 - 10773 : 제로  (0) 2020.12.01

+ Recent posts