코딩테스트/✳️코드트리

[코드트리] 십자가 모양의 지속적 폭발

@soohh 2024. 6. 20. 17:19

https://www.codetree.ai/missions/2/problems/cross-shape-continuous-bomb?&utm_source=clipboard&utm_medium=text

 

🔷 나의 구현 스케치

0행부터 n행까지 주어진 열의 값이 0이 아닌 첫 행을 찾아 bomb() 을 수행한다. bomb은 선택된 칸에 적혀있는 크기만큼 십자가 모양의 터지는 것을 의미하는데, 이는 배열 범위안에 있는 십자가 모양의 크기의 수들을 0으로 한다.

이후 down 함수를 통해 각 열을 n행부터 1행까지 확인하며 빈행은 한칸 윗 행의 값을 아래로 내리고 윗 행을 0으로 두어 중력이 작용하는 것을 구현한다.

 

🔷  나의 구현 코드

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

def bomb(x,y, value):
    for dx,dy in zip(dxs, dys):
        nx,ny = x,y
        grid[x][y] = 0
        for _ in range(value):
            nx,ny = nx+dx, ny+dy
            if in_range(nx,ny):
                grid[nx][ny] = 0
            else:
                break
    down()

def down():
    for col in range(n):
        for row in range(n-1,0,-1):
            if not grid[row][col]:
                grid[row][col],grid[row-1][col]  = grid[row-1][col],0

n,m = map(int,input().split())
grid = [list(map(int,input().split())) for _ in range(n)]
dxs, dys = [0,1,0,-1], [1,0,-1,0]

for _ in range(m):
    col = int(input())
    col -= 1
    for row in range(n):
        if grid[row][col]:
            bomb(row, col, grid[row][col]-1)
            break
for row in grid:
    print(*row)