구현해야 하는 기능을 아래와 같이 3개로 나누고 하나씩 구현하니까 코드가 더 간단하고 구현하기도 더 수월했다.
def check(m,n,board):
isChange= False
temp = [[0]*n for _ in range(m)]
for i in range(1, m):
for j in range(1, n):
if board[i][j]== board[i-1][j] == board[i][j-1] ==board[i-1][j-1] != '0':
isChange = True
temp[i][j] = temp[i-1][j] = temp[i][j-1] = temp[i-1][j-1] =1
return temp, isChange
isChange
는 (3)에서 변화가 없으면 반복을 중단하기 위한 boolean값이다.
def reboard(m ,n, board, temp):
newboard = [['0']*n for _ in range(m)]
cnt = 0
for j in range(n):
i = k = m-1
while i >= 0:
if temp[i][j] == 1:
cnt += 1
i -= 1
else:
newboard[k][j] = board[i][j]
k -= 1
i -= 1
return newboard, cnt
cnt
는 변경한 값이 몇 개인지 계산해서 answer
에 더하기 위한 변수이다.
변화가 없을 때 까지 (4개씩 붙어있는 같은 값이 없을 때 까지) (1)~(2)를 반복한다.
def check(m,n,board):
isChange= False
temp = [[0]*n for _ in range(m)]
for i in range(1, m):
for j in range(1, n):
if board[i][j]== board[i-1][j] == board[i][j-1] ==board[i-1][j-1] != '0':
isChange = True
temp[i][j] = temp[i-1][j] = temp[i][j-1] = temp[i-1][j-1] =1
return temp, isChange
def reboard(m ,n, board, temp):
newboard = [['0']*n for _ in range(m)]
cnt = 0
for j in range(n):
i = k = m-1
while i >= 0:
if temp[i][j] == 1:
cnt += 1
i -= 1
else:
newboard[k][j] = board[i][j]
k -= 1
i -= 1
return newboard, cnt
def solution(m, n, board):
board = list(map(list, board))
answer = 0
isChange = True
while isChange:
temp, isChange = check(m ,n, board)
board, cnt = reboard(m ,n, board, temp)
answer += cnt
return answer