Algorithm(CodeTree, Python)/Simulation
[코드트리] 2차원 바람 Python
kurooru
2023. 1. 16. 14:19
# n, m, q 입력
n, m, q = map(int, input().split())
# grid 입력
grid = [
list(map(int, input().split()))
for _ in range(n)
]
# winds 입력
winds = []
for _ in range(q):
r1, c1, r2, c2 = map(int, input().split())
r1, c1, r2, c2 = r1 - 1, c1 -1, r2 - 1, c2 -1
winds.append((r1, c1, r2, c2))
# 함수들
# in_range(x, y)
def in_range(x, y):
return 0 <= x < n and 0 <= y < m
# get_replace_num(x, y)
def get_replace_num(x, y):
# dxs, dys
dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
# curr_sum, num_to_divide
curr_sum, num_to_divide = grid[x][y], 1
# 주위 탐색
for dx, dy in zip(dxs, dys):
nx, ny = x + dx, y + dy
# 범위 내에 있으면
if in_range(nx, ny):
# curr_sum에 추가
curr_sum += grid[nx][ny]
# num_to_divide 올려주기
num_to_divide += 1
# 반환
return curr_sum // num_to_divide
# replace_to_average(sx, sy, ex, ey)
def replace_to_average(sx, sy, ex, ey):
# temp
temp = [
[0] * m
for _ in range(n)
]
# 범위 내 모든 수에 대하여
for i in range(sx, ex + 1):
for j in range(sy, ey + 1):
# 바꿀 수를 구하여 temp에 저장
temp[i][j] = get_replace_num(i, j)
# 바꿔 주기
for i in range(sx, ex + 1):
for j in range(sy, ey + 1):
grid[i][j] = temp[i][j]
# circulation(sx, sy, ex, ey)
def circulation(sx, sy, ex, ey):
# temp_1, temp_2, temp_3, temp_4
temp_1, temp_2, temp_3, temp_4 = grid[sx+1][sy], grid[sx][ey], grid[ex][ey], grid[ex][sy]
# 윗 줄 바꿔주기
for i in range(ey, sy, -1):
grid[sx][i] = grid[sx][i-1]
grid[sx][sy] = temp_1
# 오른쪽 줄 바꿔주기
for i in range(ex, sx, -1):
grid[i][ey] = grid[i-1][ey]
grid[sx+1][ey] = temp_2
# 아랫 줄 바꿔주기
for i in range(sy, ey):
grid[ex][i] = grid[ex][i+1]
grid[ex][ey-1] = temp_3
# 왼쪽 줄 바꿔주기
for i in range(sx+1, ex):
grid[i][sy] = grid[i+1][sy]
grid[ex-1][sy] = temp_4
# 설계
for wind in winds:
# unpacking
sx, sy, ex, ey = wind
# circulation
circulation(sx, sy, ex, ey)
# replace_to_average
replace_to_average(sx, sy, ex, ey)
# 출력
for i in range(n):
for j in range(m):
print(grid[i][j], end=' ')
print()