풀이 )
미세먼지 확산 전 격자판을 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 |