https://school.programmers.co.kr/learn/courses/30/lessons/17679
target(set)에 터질 블록의 위치를 저장한다.
target의 길이를 answer에 더한다.만약 터질 블록이 없다면 종료한다.
터질 블록이 있다면 해당 블록을 " " 로 변경한다.
하단 줄부터 검색하면서 내려야 할 블록을 찾는다.
위에 줄부터 검색하면 내려할 할 블록의 맨아래만 내려간다.내려할 블록의 아래 칸이 빈블록(" ")이라면 해당 값을 빈 블록의 위치로 옮기고
원래 블록 위치는 빈블록으로 만들어준다.
def solution(m, n, board):
answer = 0
for i in range(m):
board[i] = list(board[i])
dy = [0, 0, 1, 1]
dx = [0, 1, 0, 1]
while True:
target = set()
for row in range(0, m - 1):
for col in range(0, n - 1):
block = board[row][col] != " " \
and board[row][col] == board[row][col + 1] \
and board[row][col] == board[row + 1][col] \
and board[row][col] == board[row + 1][col + 1]
if block:
for i in range(4):
ny = row + dy[i]
nx = col + dx[i]
target.add((ny, nx))
if len(target) == 0:
break
answer += len(target)
for row, col in target:
board[row][col] = " "
for row in range(m-2, -1, -1):
for col in range(n):
if board[row][col] != " ":
target_y = row
while target_y + 1 < m and board[target_y + 1][col] == " ":
board[target_y + 1][col] = board[target_y][col]
board[target_y][col] = " "
target_y += 1
return answer