url : https://www.codetree.ai/training-field/frequent-problems/problems/heros-of-storm/submissions?page=1&pageSize=20&order=tier
Level : Gold 4
설계 시간 / 총 시간 : 5분/38분
import copy
# 설계 5분 # 총 시간 38분
n, m, t = map(int, input().split())
X = [-1,0,0,1]
Y = [0,1,-1,0]
wind = []
dirty = []
for i in range(n):
list_ = list(map(int, input().split()))
for idx, li in enumerate(list_):
if li == -1:
wind.append([i, idx])
dirty.append(list_)
def in_range(y,x):
if 0<=y<n and 0<=x<m:
return True
return False
def dirty_move():
result = copy.deepcopy(dirty)
for i in range(n):
for j in range(m):
if dirty[i][j] > 0:
move = dirty[i][j] // 5
for _ in range(4):
dy = Y[_] + i
dx = X[_] + j
if in_range(dy, dx) and dirty[dy][dx] != -1:
result[dy][dx] += move
result[i][j] -= move
return result
# 반시계
def right(sy, sx):
result = copy.deepcopy(dirty)
result[sy][sx+1] = 0
for x in range(sx+2, m):
result[sy][x] = dirty[sy][x - 1]
for y in range(sy-1, -1, -1):
result[y][m-1] = dirty[y+1][m-1]
for x in range(m-2, -1, -1):
result[0][x] = dirty[0][x+1]
for y in range(1, sy):
result[y][0] = dirty[y-1][0]
return result
# 시계
def left(sy, sx):
result = copy.deepcopy(dirty)
result[sy][sx+1] = 0
for x in range(sx + 2, m):
result[sy][x] = dirty[sy][x - 1]
for y in range(sy + 1, n):
result[y][m-1] = dirty[y-1][m-1]
for x in range(m - 2, -1, -1):
result[n-1][x] = dirty[n-1][x+1]
for y in range(n - 2, sy, -1):
result[y][0] = dirty[y + 1][0]
return result
for i in range(t):
dirty = dirty_move()
sy, sx = wind[0]
dirty = right(sy, sx)
sy, sx = wind[1]
dirty = left(sy, sx)
tot_dirt = 2
for i in range(n):
tot_dirt += sum(dirty[i])
print(tot_dirt)
먼지 이동 / 시계방향 이동 / 반시계 방향 이동 -> 총 세가지 함수로 분리
주의할점
1. 먼지가 이동하고 나서 주변에 더해지는 건 나중이므로 먼지의 확산의 양에 영향을 미치지 않도록 배열을 따로 복사하는 것이 중요함
2. 돌풍이 이동할 때 범위체크를 정확히 하는 것이 중요