# 지워지는 블록이 몇 개인지
def solution(m, n, board):
board = [list(i) for i in board]
def find4(board):
deleted = []
for i in range(m - 1):
for j in range(n - 1):
if board[i][j] != '0' and board[i][j] == board[i+1][j] == board[i][j+1] == board[i+1][j+1]:
deleted.append([i,j])
return deleted
def delete4(board, ls):
d = []
for dot in ls:
x,y = dot
for i,j in ((x,y),(x+1,y),(x,y+1),(x+1,y+1)):
if board[i][j] != '0':
d.append((i,j))
board[i][j] = '0'
return d
def move(ls):
ls.sort(key = lambda x: x[1])
for (y,x) in ls:
for k in range(y-1, -1, -1):
if board[k][x] != '0':
board[y][x] = board[k][x]
board[k][x] = '0'
y-=1
while True:
d_list = find4(board)
if not d_list:
break
d = delete4(board, d_list)
move(d)
return sum(board, []).count('0')
find4
: 전체 board 를 돌며 0(비어있는 칸)이 아니면서, 해당 블록을 좌상향으로 하는 4칸이 일치하는 좌표를 찾아 list 에 넣는다.
delete4
: find4 에서 찾은 좌표들을 이용하여 이를 좌상향으로 하는 4칸 블록을 '0'(비어있는 칸)으로 바꾼다. find4
에서 동시에 해주지 않은 이유는, 4칸 블록을 찾자마자 지워버리면 겹치는 사각형을 모두 지우지 못하기 때문이다.
move
: 모두 터지고 난 후 블록을 다시 채우는 과정이다
'0' 을 넣어줄 것을 0 을 넣어줘서 에러가 났었다. 바보