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()'Algorithm(CodeTree, Python) > Simulation' 카테고리의 다른 글
| [코드트리] 합쳐지는 구슬들 Python (0) | 2023.01.26 |
|---|---|
| [코드트리] 숫자의 순차적 이동 Python (0) | 2023.01.25 |
| [코드트리] 벽이 있는 충돌 실험 Python (0) | 2023.01.24 |
| [코드트리] 숫자가 가장 큰 인접한 곳으로 동시에 이동 Python (0) | 2023.01.24 |
| [코드트리] 핀볼게임 Python (0) | 2023.01.23 |