https://www.acmicpc.net/problem/17144
먼지의 확산을 적용하고 공기청정기의 위,아래를 나누어 구현했다.
공기청정기에서 배열의 테두리를 회전하는 부분이 어려웠다.
r,c,t = map(int,input().split())
room = []
for i in range(r):
room.append(list(map(int,input().split())))
dx = [0,0,1,-1]
dy = [1,-1,0,0]
clock = 0
reverse =0
def difuse(x,y):
cnt = 0
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if 0<=nx<r and 0<=ny<c:
if room[nx][ny]!=-1:
cnt += 1
temp[nx][ny] = temp[nx][ny] + room[x][y]//5
room[x][y] = room[x][y] - room[x][y]//5 * cnt
for _ in range(t):
temp = [[0 for _ in range(c)] for _ in range(r)]
#확산값 임시
for i in range(r):
for j in range(c):
if room[i][j] >0:
difuse(i,j)
#확산값 적용
for x in range(r):
for y in range(c):
if room[x][y]==-1:
if clock == 0:
clock = x
elif clock != 0 and reverse == 0:
reverse = x
room[x][y] = room[x][y] + temp[x][y]
#공기청정기 위 반시계방향
# → → → → → → →
RB = room[clock][c-1]
for j in range(c-1,0,-1):
room[clock][j] = room[clock][j-1]
if room[clock][j]<0:
room[clock][j]=0
# # ↑ ↑ ↑ ↑ ↑
RT = room[0][c - 1]
for k in range(clock):
room[k][c-1] = room[k+1][c-1]
if k==clock-1:
room[k][c-1] = RB
# ← ← ← ← ← ←
LT = room[0][0]
for j in range(c-1):
room[0][j] = room[0][j+1]
if j==c-2:
room[0][j] = RT
# ↓ ↓ ↓ ↓ ↓ ↓
for j in range(clock-1,0,-1):
room[j][0] = room[j-1][0]
if j==1:
room[j][0] = LT
#공기청정기 아래 시계
RT = room[reverse][c-1]
for j in range(c-1,0,-1):
# → → → → → → →
room[reverse][j] = room[reverse][j-1]
if room[reverse][j]<0:
room[reverse][j]=0
# ↓ ↓ ↓ ↓ ↓ ↓
RB = room[r-1][c-1]
for j in range(r-1, reverse, -1):
room[j][c-1] = room[j - 1][c-1]
if j == reverse+1:
room[j][c-1] = RT
# ← ← ← ← ← ←
LB = room[r-1][0]
for j in range(c-1):
room[r-1][j] = room[r-1][j+1]
if j==c-2:
room[r-1][j] = RB
# # ↑ ↑ ↑ ↑ ↑
for k in range(reverse+1,r-1):
room[k][0] = room[k + 1][0]
if k == r - 2:
room[k][0] = LB
ans = 0
for i in range(r):
ans += sum(room[i])
print(ans+2)