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

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

by kurooru 2023. 1. 25.

3차원 배열로 해결했다.

# n, m 입력
n, m = map(int, input().split())
# grid 입력
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]
# orders 입력
orders = list(map(int, input().split()))

# 함수들
# is_empty(x, y)
def is_empty(x, y):
    return not len(next_grid[x][y])

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

# simulate(x, y, idx)
def simulate(x, y, idx):

    # mx, my, curr_max
    mx, my, curr_max = -1, -1, 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
        # 범위 내에 있고, 비어있지 않으며, curr_max보다 크면
        if in_range(nx, ny) and not is_empty(nx, ny) and max(next_grid[nx][ny]) > curr_max:
            # mx, my, curr_max update
            mx, my, curr_max = nx, ny, max(next_grid[nx][ny])
    
    # 갈곳이 없다면
    if mx == -1 and my == -1:
        # 종료
        return
    
    # 갈 곳이 있다면 바꿔주기
    temp = next_grid[x][y][:idx+1]
    next_grid[mx][my] = temp + next_grid[mx][my]
    next_grid[x][y] = next_grid[x][y][idx+1:]

# start(curr_num)
def start(curr_num):
    
    # next_grid를 돌면서
    for i in range(n):
        for j in range(n):
            for h in range(len(next_grid[i][j])):
                
                # curr_num을 찾으면,
                if next_grid[i][j][h] == curr_num:
                    # simulate
                    simulate(i, j, h)
                    # 함수 종료
                    return
# 설계
# next_grid -> 3차원 배열
next_grid = [
    [[] for _ in range(n)] 
    for _ in range(n)
    ]

for i in range(n):
    for j in range(n):
        next_grid[i][j].append(grid[i][j])

# 움직이는 순서
for order in orders:
    # start
    start(order)

# 출력
for i in range(n):
    for j in range(n):
        # 빈 배열이면
        if not next_grid[i][j]:
            print('None')
        # 숫자가 있으면
        else:
            for num in next_grid[i][j]:
                print(num, end=' ')
            print()