Algorithm(CodeTree, Python)/Simulation

[코드트리] 숫자의 순차적 이동 Python

kurooru 2023. 1. 25. 14:23
# n, m 입력
n, m = map(int, input().split())
# grid 입력
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]

# in_range(x, y)
def in_range(x, y):
    return 0 <= x < n and 0 <= y < n

# change(x, y)
def change(x, y):
    
    # curr_max
    curr_max = 0

    # dxs, dys
    dxs, dys = [-1, -1, -1, 0, 1, 1, 1, 0], [-1, 0, 1, 1, 1, 0, -1, -1]
    for dx, dy in zip(dxs, dys):
        nx, ny = x + dx, y + dy
        # 범위 내에 있고, 최댓값보다 크다면
        if in_range(nx, ny) and grid[nx][ny] > curr_max:
            # cx, cy, curr_max update
            cx, cy, curr_max = nx, ny, grid[nx][ny]

    # temp
    temp = grid[x][y]

    # 바꿔주기
    grid[x][y] = grid[cx][cy]
    grid[cx][cy] = temp

# simulate(curr_num)
def simulate(curr_num):
    
    # grid를 돌면서
    for i in range(n):
        for j in range(n):
            # curr_num을 찾으면
            if grid[i][j] == curr_num:
                # 바꿔주고
                change(i, j)
                # 함수종료
                return

# 설계
# 총 m번 반복
for _ in range(m):

    # 현재 움직여줄 번호
    for i in range(1, n**2 + 1):
        # simulate(i)
        simulate(i)

# 출력
for i in range(n):
    for j in range(n):
        print(grid[i][j], end=' ')
    print()