
PYPY3
우선 먼지가 확산되는 것은 diffuse() 함수를 통해 확산되고, 공기청정기는 cleanup() 함수를 통해 먼지를 이동 및 흡수한다.
중요한 것은 공기청정기로 먼지를 이동 및 흡수 시킬 때였다. 요령이 없어서 그냥 하나하나 구현했다.
공기청정기의 위, 아래를 나누는 것은 물론 위에서도 진행 방향대로 4개를 나눔.
위 공기청정기를 통해 오른쪽 - 위쪽 - 왼쪽 - 아래쪽 으로 먼지가 이동하고
아래 공기청정기를 통해 오른쪽 - 아래쪽 - 왼쪽 - 위쪽 으로 먼지가 이동함.
import sys
from copy import deepcopy
r,c,t = map(int,sys.stdin.readline().split())
arr = []
for _ in range(r):
arr.append(list(map(int,sys.stdin.readline().split())))
# 북 동 남 서
dx = [0,1,0,-1]
dy = [-1,0,1,0]
airc = []
# 먼지의 확산
def diffuse():
newarr = deepcopy(arr)
for i in range(r):
for j in range(c):
# 공기청정기 위치 미리 저장해두기
if arr[i][j] == -1:
airc.append([i,j])
# 먼지 확산시키기, 최소 먼지의 양이 5이상이어야 확산이 됨
if arr[i][j] > 4:
cnt = 0
amt = arr[i][j] // 5
for k in range(4):
y = j + dx[k]
x = i + dy[k]
if 0<=x<r and 0<=y<c and newarr[x][y] != -1:
newarr[x][y] += amt
cnt += 1
newarr[i][j] -= amt*cnt
return newarr
# 공기청정기의 역할 : 먼지 이동 및 흡수
# 나는 공기청정기의 위, 아래를 나누는 것은 물론 위에서도 진행 방향대로 4개를 나눔
# 위 공기청정기를 통해 오른쪽 - 위쪽 - 왼쪽 - 아래쪽 으로 먼지가 이동하고
# 아래 공기청정기를 통해 오른쪽 - 아래쪽 - 왼쪽 - 위쪽 으로 먼지가 이동함.
def cleanup(arr):
newarr = deepcopy(arr)
nxy2 = newarr[0][c-1]
nxy3 = newarr[0][0]
nxy4 = newarr[r-1][c-1]#4
nxy5 = newarr[r-1][0] #0
# 위쪽 공기청정기
x,y = airc[0]
nxy1 = newarr[x][c-1]
cur = newarr[x][y+1]
for i in range(y+1,c-1):
nxt = newarr[x][i+1]
if i == y+1:
newarr[x][i] = 0
newarr[x][i+1] = cur
cur = nxt
cur = newarr[x-1][c-1] #6
newarr[x-1][c-1] = nxy1 #5
for i in range(x-1,-1,-1):
nxt = newarr[i-1][c-1]
newarr[i-1][c-1] = cur
cur = nxt
cur = newarr[0][c-2] #1
newarr[0][c-2] = nxy2 #8
for i in range(c-2,0,-1):
nxt = newarr[0][i-1]
newarr[0][i-1] = cur
cur = nxt
cur = newarr[1][0] #0
newarr[1][0] = nxy3
for i in range(1,x-1):
nxt = newarr[i+1][0]
newarr[i+1][0] = cur
cur = nxt
# 아래쪽 공기청정기
x,y = airc[1]
nxy1 = newarr[x][c-1]
cur = newarr[x][y+1]
for i in range(y+1,c-1):
nxt = newarr[x][i+1]
if i == y+1:
newarr[x][i] = 0
newarr[x][i+1] = cur
cur = nxt
cur = newarr[x+1][c-1] #8
newarr[x+1][c-1] = nxy1 #0
for i in range(x+1,r-1):
nxt = newarr[i+1][c-1]
newarr[i+1][c-1] = cur
cur = nxt
cur = newarr[r-1][c-2]
newarr[r-1][c-2] = nxy4 #4
for i in range(c-2,0,-1):
nxt = newarr[r-1][i-1]
newarr[r-1][i-1] = cur
cur = nxt
cur = newarr[r-2][0]
newarr[r-2][0] = nxy5
for i in range(r-2,x+1,-1):
nxt = newarr[i-1][0]
newarr[i-1][0] = cur
cur = nxt
return newarr
# 각 초마다 먼지 확산 및 공기청정기 작동
for _ in range(t):
arr = diffuse()
#print("start",arr)
arr = cleanup(arr)
#print("end",arr)
# 먼지의 양을 모두 더하고 공기청정기 값은 빼줘야 하므로 + 2
res = 0
for i in range(r):
res += sum(arr[i])
print(res+2)