https://www.acmicpc.net/problem/17144
# 시뮬레이션
r,c,t=map(int,input().split())
board=[list(map(int,input().split())) for _ in range(r)]
for i in range(r):
for j in range(c):
if board[i][j]==-1:
by=i
d=[[0,1],[0,-1],[1,0],[-1,0]]
# 확산
def diffusion(board):
result=[[0]*c for _ in range(r)]
for i in range(r):
for j in range(c):
if board[i][j]>0:
cnt=0
for dy,dx in d:
ny=dy+i
nx=dx+j
if 0<=ny<r and 0<=nx<c and board[ny][nx]!=-1:
cnt+=1
result[ny][nx]+=board[i][j]//5
result[i][j]+=board[i][j]-board[i][j]//5*cnt
elif board[i][j]==-1:
result[i][j]=-1
return result
# 공기청정기 돌리기
def run(board,by):
ty=by-1
for i in range(ty-2,-1,-1):
board[i+1][0]=board[i][0]
for i in range(1,c):
board[0][i-1]=board[0][i]
for i in range(1,ty+1):
board[i-1][c-1]=board[i][c-1]
for i in range(c-2,0,-1):
board[ty][i+1]=board[ty][i]
board[ty][1]=0
for i in range(by+2,r):
board[i-1][0]=board[i][0]
for i in range(1,c):
board[r-1][i-1]=board[r-1][i]
for i in range(r-2,by-1,-1):
board[i+1][c-1]=board[i][c-1]
for i in range(c-2,0,-1):
board[by][i+1]=board[by][i]
board[by][1]=0
# 시뮬
for _ in range(t):
board=diffusion(board)
run(board,by)
# 카운팅
answer=0
for i in range(r):
for j in range(c):
answer+=board[i][j]
print(answer+2)
시뮬레이션 문제로 미세먼지가 확산하는 함수와 공기청정기가 작동하는 함수를 만들어서 풀이했습니다