본문 바로가기
Algorithm(CodeTree, Python)/Simulation

[코드트리] 숫자가 가장 큰 인접한 곳으로 동시에 이동 Python

by kurooru 2023. 1. 24.
# n, m, t 입력
n, m, t = map(int, input().split())
# grid 입력
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]
# count 
count = [
    [0] * n
    for _ in range(n)
]
for _ in range(m):
    sx, sy = map(int, input().split())
    sx, sy = sx - 1, sy - 1
    count[sx][sy] = 1

# 함수들
# in_range(x, y)
def in_range(x, y):
    return 0 <= x < n and 0 <= y < n
    
# move_on_next_count(x, y)
def move_on_next_count(x, y):
    # dxs, dys -> 상하좌우 순서
    dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
    # max_num, ax, ay
    max_num, ax, ay = 0, -1, -1
    for dx, dy in zip(dxs, dys):
        nx, ny = x + dx, y + dy
        # nx, ny가 범위 내에 있고, max_num보다 크면
        if in_range(nx, ny) and grid[nx][ny] > max_num:
            # max_num, ax, ay 바꿔주기
            max_num, ax, ay = grid[nx][ny], nx, ny
    # next_count 올려주기
    next_count[ax][ay] += 1

# 설계
for _ in range(t):
    
    # next_count
    next_count = [
        [0] * n
        for _ in range(n)
    ]

    # count를 돌며
    for i in range(n):
        for j in range(n):
            # 구슬을 발견하면
            if count[i][j]:
                # next_count에서 움직임
                move_on_next_count(i, j)
    
    # next_count를 돌며
    for i in range(n):
        for j in range(n):
            # 두개 이상의 구슬을 발견하면
            if next_count[i][j] >= 2:
                # 펑
                next_count[i][j] = 0
    
    # next_count를 count에 복사
    for i in range(n):
        for j in range(n):
            count[i][j] = next_count[i][j]

# ans
ans = 0
# 최종 count를 돌며
for i in range(n):
    for j in range(n):
        # ans에 구슬 추가
        ans += count[i][j]
# 출력
print(ans)