Lv2 프로그래머스(Programmers)[Python][파이썬] 프렌즈4블록

"""
출처:프로그래머스,
https://school.programmers.co.kr/learn/courses/30/lessons/17679
"""

# 풀이 과정
# idea: 첫번쨰로 지워지는 블록 제거 후 재배열 후 다시 블록 제거 반복!
def solution(m, n, board):
from collections import deque

b = []

for k in range(m):
b.append(list(board[k]))

result = 0

dx = [1, 0, 1]
dy = [0, 1, 1]

while True:
count = 0 # 지워지는 블록 체크
check = deque([]) # 지워지는 블록 목록

# i,j를 중심으로 팔방위 탐색

for i in range(m):
for j in range(n):

if b[i][j] == 0:
continue

if j - 1 >= 0 and i - 1 >= 0:
if b[i][j] == b[i - 1][j - 1] == b[i][j - 1] == b[i - 1][j]:
check.append([i, j])
continue
if j + 1 < n and i - 1 >= 0:
if b[i][j] == b[i][j + 1] == b[i - 1][j + 1] == b[i - 1][j]:
check.append([i, j])
continue
if j - 1 >= 0 and i + 1 < m:
if b[i][j] == b[i][j - 1] == b[i + 1][j - 1] == b[i + 1][j]:
check.append([i, j])
continue
if j + 1 < n and i + 1 < m:
if b[i][j] == b[i + 1][j] == b[i + 1][j + 1] == b[i][j + 1]:
check.append([i, j])
continue
while check:
one, two = check.popleft()
b[one][two] = 0
count += 1

if count == 0: # 지워지는 블록이 없을 경우 답
return result

# 블록 재배치 위에 있는걸로 대체
# 0이 아닌 부분을 내리는 방법?

for i in range(m - 1, -1, -1):
for j in range(n):

if b[i][j] == 0:
start = i - 1

while start >= 0:
if b[start][j] != 0:
b[i][j] = b[start][j]
b[start][j] = 0
break
else:
start -= 1

result += count

answer = result
return answer