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()