1. 문제
https://programmers.co.kr/learn/courses/30/lessons/17679
2. 풀이
- 시뮬레이션을 이용하여 풀면 되는 문제입니다.
- 상세 풀이는 주석을 통하여 정리하였습니다.
def solution(m, n, board):
new_board = [list(x) for x in board]
delete_list = []
while True:
# 4개 일치하는 영역 찾고 배열에 넣기
for r_idx in range(m - 1):
for c_idx in range(n - 1):
if new_board[r_idx][c_idx] == 0:
continue
if new_board[r_idx][c_idx] == new_board[r_idx + 1][c_idx] == new_board[r_idx][c_idx + 1] == \
new_board[r_idx + 1][c_idx + 1]:
delete_list.append((r_idx, c_idx))
# 4개 일치하는 영역 없으면 턴 종료
if len(delete_list) == 0:
break
# 지워야 할 영역을 0으로 채워버림
for left_top in delete_list:
r_idx, c_idx = left_top
new_board[r_idx][c_idx] = new_board[r_idx + 1][c_idx] = new_board[r_idx][c_idx + 1] = new_board[r_idx + 1][
c_idx + 1] = 0
delete_list = []
# 공중에 떠있는 요소들을 밑으로 내려버리기
for c_idx in range(n):
top_r_idx = m
for r_idx in range(m - 1, -1, -1):
if new_board[r_idx][c_idx] != 0:
if top_r_idx - 1 != r_idx:
new_board[top_r_idx - 1][c_idx] = new_board[r_idx][c_idx]
new_board[r_idx][c_idx] = 0
top_r_idx = top_r_idx - 1
## 개수 체크
answer = 0
for r_idx in range(m):
for c_idx in range(n):
if new_board[r_idx][c_idx] == 0:
answer += 1
return answer