시뮬레이션 구현 능력을 묻는 문제같아서 구현능력에 초점을 맞췄다.
블록의 크기가 최대 30x30밖에 안되어서 시간복잡도 신경쓰지 않았다.
- 4x4 블록에 모두 같은 프렌즈가 있으면 플래그 처리하기.
- 각 컬럼마다 플래그가 있는 프렌즈는 빼고 내리기
2.1 프렌즈가 터져서(?) 빈 공간이 생기면X저장- 프렌즈가 터지지 않으면(?) 반복문 종료
def is_same(items):
item = items[0]
if item == 'X':
return False
for x in items:
if x != item:
return False
return True
def is_change(m, n, checker):
for i in range(m):
for j in range(n):
if checker[i][j] == 1:
return True
return False
def check_friends(m, n, board):
checker = [[0 for i in range(n)] for j in range(m)]
for i in range(m - 1):
for j in range(n - 1):
items = []
items.append(board[i][j])
items.append(board[i][j+1])
items.append(board[i+1][j])
items.append(board[i+1][j+1])
#print(items)
if is_same(items):
checker[i][j] = 1
checker[i][j+1] = 1
checker[i+1][j] = 1
checker[i+1][j+1] = 1
return checker
def show_board(m, n, board):
for i in range(m):
for j in range(n):
print(board[i][j], end='')
print()
print()
def reset_column(m, n, board, checker):
n_blocks = 0
for j in range(n):
col = []
for i in range(m-1, -1, -1):
if checker[i][j] == 0:
col.append(board[i][j])
# fill the column
while len(col) < m:
col.append('X')
n_blocks += 1
#print(col)
# update board
for i in range(m-1, -1, -1):
board[i][j] = col[m-1-i]
return n_blocks
def solution(m, n, board):
answer = 0
new_board = [[0 for i in range(n)] for j in range(m)]
for i in range(m):
for j in range(n):
new_board[i][j] = board[i][j]
while True:
checker = check_friends(m, n, new_board)
if not is_change(m, n, checker):
break
answer += reset_column(m, n, new_board, checker)
#show_board(m, n, new_board)
return answer