# -*- coding: utf-8 -*-
def find_4_blocks(board, x, y, m, n): # (x,y)를 기준으로 4개의 블록이 생기는지 확인
if x+1 == m or y+1 == n:
return False
check_set = {board[x][y], board[x+1][y], board[x][y+1], board[x+1][y+1]}
if check_set == {0}:
return False
if len(check_set) == 1 :
return True
else:
return False
def remove_block(board, count_list, m, n): # 삭제 블록 리스트 파악
a = []
# count_list 를 이용해 지우고자 하는 블록을 모두 파악
for data in count_list:
x, y = data[0], data[1]
a.append((x,y))
a.append((x+1,y))
a.append((x,y+1))
a.append((x+1,y+1))
a = set(a) # 중복 제거
for i in range(m):
for j in range(n):
for data in a:
board[data[0]][data[1]] = 0 # 삭제하려는 블록을 0으로 변환
return board
def down_block(board, m, n): # 0 있는 경우 아래로 이동
for j in range(n):
count = 0
temp = []
for i in range(m):
if board[i][j] == 0:
count +=1
else:
temp.append(board[i][j])
if count !=0: # 블록 변환 필요 (각 행마다 0의 개수)
k = 0
for i in range(m):
if count != 0:
board[i][j] = 0
count -= 1
else:
board[i][j] = temp[k]
k += 1
return board
def solution(m, n, board):
answer = 0
for i in range(len(board)):
board[i] = list(board[i])
count_list = [1]
while (count_list!=[]): # 더 이상 삭제할 수 있는 보드가 없을 때까지 지속
count_list = []
for i in range(m):
for j in range(n):
if find_4_blocks(board, i, j, m, n): # 주변 4개의 블록이 참일 때
count_list.append((i,j))
board = remove_block(board, count_list, m, n) # 보드 변환
board = down_block(board, m, n)
for i in range(m):
for j in range(n):
if board[i][j] == 0: # 0 : 없어진 블록의 개수
answer += 1
return answer
solution(4, 5, ["CCBDE", "AAADE", "AAABF", "CCBBF"])