이번 문제는 BFS를 통해 해결하였다. 현재 좌표와 연결된 좌표 중 같은 값들을 가지는 좌표들을 찾아 이 좌표들의 개수가 k 이상일 경우 이 값들을 없애고, 밑으로 쌓는 문제로, BFS를 통해 각 칸들의 방문처리 여부를 확인하며 탐색하여 해결하였다.
import copy
from collections import deque
n, k = map(int, input().split())
grid = [list(str(input())) for _ in range(n)]
dy, dx = [0, 1, 0, -1], [1, 0, -1, 0]
def bfs(y, x):
q = deque()
q.append((y, x))
visited[y][x] = True
path = [(y, x)]
while q:
y, x = q.popleft()
for i in range(4):
ny, nx = y+dy[i], x+dx[i]
if 0 <= ny < n and 0 <= nx < 10 and not visited[ny][nx] and grid[ny][nx] == grid[y][x]:
visited[ny][nx] = True
path.append((ny, nx))
q.append((ny, nx))
if len(path) >= k:
for py, px in path:
grid[py][px] = '0'
def drop_nums():
global grid
new_grid = [['0' for _ in range(10)] for _ in range(n)]
for i in range(10):
idx = n-1
for j in range(n-1, -1, -1):
if grid[j][i] != '0':
new_grid[idx][i] = grid[j][i]
idx -= 1
grid = copy.deepcopy(new_grid)
while True:
visited = [[False for _ in range(10)] for _ in range(n)]
tmp = copy.deepcopy(grid)
for i in range(n):
for j in range(10):
if grid[i][j] and not visited[i][j]:
bfs(i, j)
drop_nums()
if tmp == grid:
break
for i in range(n):
print(''.join(grid[i]))