https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
[난이도] Gold5
[유형] 시뮬레이션
[풀이]
문제의 조건대로 시뮬레이션을 해준다.
배열이 덮어씌워지는 실수를 하지 않기 위해 2차원 vector를 생성해주며 답을 구해주면 편하다.
#include <cstdio>
#include <vector>
using namespace std;
using vvi = vector<vector<int>>;
int dy[4]={-1,1,0,0},dx[4]={0,0,1,-1};
int R,C,T,up=-1;
vvi sol(vvi A){
vvi ret(R,vector<int>(C));
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
if(A[i][j]>0){
int cnt=0;
int d = A[i][j]/5;
for(int k=0;k<4;k++){
int ny=i+dy[k],nx=j+dx[k];
if(ny<0||nx<0|ny>=R||nx>=C||A[ny][nx]==-1) continue;
ret[ny][nx]+=d;
cnt++;
}
ret[i][j]+=A[i][j]-cnt*d;
}
}
}
vvi ret2 = ret;
for(int i=2;i<C;i++) {
ret2[up][i] = ret[up][i-1];
ret2[up+1][i] = ret[up+1][i-1];
}
for(int i=C-2;i>=0;i--) {
ret2[0][i] = ret[0][i+1];
ret2[R-1][i] = ret[R-1][i+1];
}
for(int i=up-1;i>=0;i--) ret2[i][C-1] = ret[i+1][C-1];
for(int i=1;i<=up;i++) ret2[i][0] = ret[i-1][0];
for(int i=up+2;i<R;i++) ret2[i][C-1] = ret[i-1][C-1];
for(int i=R-2;i>=up+1;i--) ret2[i][0] = ret[i+1][0];
ret2[up][0]=ret2[up+1][0]=-1;
ret2[up][1]=ret2[up+1][1]=0;
return ret2;
}
int main(){
scanf("%d%d%d",&R,&C,&T);
vvi A(R,vector<int>(C));
for(int i=0;i<R;i++)
for(int j=0;j<C;j++) {
scanf("%d",&A[i][j]);
if(A[i][j]==-1){
if(up==-1) up=i;
}
}
while(T--) A=sol(A);
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];
printf("%d",ans);
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold5/17144.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold5] 2493 : 탑 (C++) (0) | 2021.03.25 |
---|---|
[BOJ/백준][Gold5] 1092 : 배 (C++) (0) | 2021.03.25 |
[BOJ/백준][Gold2] 10423 : 전기가 부족해 (C++) (0) | 2021.03.25 |
[BOJ/백준][Gold2] 1670 : 정상 회담 2 (C++) (0) | 2021.03.15 |
[BOJ/백준][Gold2] 2637 : 장난감조립 (C++) (0) | 2021.03.15 |