Info

내 풀이

import sys
sys.setrecursionlimit(1000000)

def read():
    return sys.stdin.readline().strip()

class Mooyo:
    def __init__(self):
        self.vec = [(0, 1), (1, 0), (0, -1), (-1, 0)]
        self.n, self.k = map(int, read().split())
        self.board = [list(map(int, list('0' + read() + '0'))) for _ in range(self.n)]
        self.board = [[0 for _ in range(12)]] + self.board + [[0 for _ in range(12)]]
        self.check = [[0 for _ in range(12)] for _ in range(self.n + 2)]
        self.dfs_stack = []

    def main(self):
        while True:
            changed = self.check_stage()
            if changed:
                self.pull_down()
            else:
                break
        self.print_board()

    def check_stage(self):
        changed = False
        self.check = [[0 for _ in range(12)] for _ in range(self.n + 2)]
        for i in range(1, self.n + 1):
            for j in range(1, 10 + 1):
                c = self.board[i][j]
                if c and not self.check[i][j]:
                    self.dfs_stack = []
                    adjacent = self.search_dfs(i, j)
                    if adjacent >= self.k:
                        changed = True
                        self.kill_adj()
                    self.dfs_stack = []
        return changed

    def search_dfs(self, y, x):
        self.check[y][x] = 1
        self.dfs_stack.append((y, x))
        adj = 1
        for i in range(4):
            yy, xx = y + self.vec[i][0], x + self.vec[i][1]
            if self.board[yy][xx] == self.board[y][x] and not self.check[yy][xx]:
                adj += self.search_dfs(yy, xx)
        return adj

    def kill_adj(self):
        for y, x in self.dfs_stack:
            self.board[y][x] = 0

    def pull_down(self):
        for j in range(1, 10 + 1):
            nonzeros = [self.board[i][j] for i in range(self.n, 0, -1) if self.board[i][j]]
            fill = nonzeros + [0 for _ in range(0, self.n - len(nonzeros))]
            for i, f in zip(range(self.n, 0, -1), fill):
                self.board[i][j] = f

    def print_board(self):
        for i in range(1, self.n+1):
            print(''.join(map(str, self.board[i][1:-1])))


mooyo = Mooyo()
mooyo.main()