1. 문제 설명
- 블록이 내려오는 부분을 위해 행과열을 바꿔줘야한다.
- zip을 사용하여 rotate를 구현해야한다.
- 문자열을 사용해서 빈공간 만큼 블록을 내려주고 위에 빈공간을 만들어줘야한다.
- set에 리스트를 넣기 위해서는 튜플로 변경해서 넣어준다.
2. 풀이
- 행과 열을 바꿔주는 rotate메소드를 만들어주고 회전시킨다.
👉zip(*iterable)은 zip을 풀어주는 기능을 한다.
def rotate(grid):
return list(map(list,zip(*grid)))
- 더이상 지울수 없을 때까지 반복문을 돌면서 블록을 지워준다.
while True:
result=remove_block()
if not result:
break
- 블록을 지워주는 remove_block() 메소드를 만들어준다.
- 행,열을 탐색하면서 4칸이 같은 블록이면 remove_set에 행,열을 넣어준다.
👉행과열을 set에 저장하기 위해 튜플형식으로 값을 넣어준다.
for row in range(n-1):
for col in range(m-1):
if board[row][col] != "" and board[row][col]==board[row+1][col]==board[row][col+1]==board[row+1][col+1]:
remove_set.add((row,col))
remove_set.add((row+1,col))
remove_set.add((row,col+1))
remove_set.add((row+1,col+1))
- remove_set을 돌면서 해당 블록을 빈 블록으로 만들어준다.
for row,col in remove_set:
board[row][col]=""
- 블록을 비웠으므로 블록을 내려주고 빈공간을 빈블록으로 채워주고 board와 지운블록의 개수를 반환한다.
for idx,row in enumerate(board):
row="".join(row)
board[idx]=[""]*(m-len(row))+list(row)
return board,len(remove_set)
- 반환받은 블록의 개수가 0개일 경우 반복문을 탈출하는 코드를 완성해준다.
while True:
board,cnt=remove_block(board,n,m)
if cnt>0:
answer+=cnt
else:
break
3. 코드
def rotate(grid):
return list(map(list,zip(*grid)))
def remove_block(board,n,m):
remove_set=set()
for row in range(n-1):
for col in range(m-1):
if board[row][col] != "" and board[row][col]==board[row+1][col]==board[row][col+1]==board[row+1][col+1]:
remove_set.add((row,col))
remove_set.add((row+1,col))
remove_set.add((row,col+1))
remove_set.add((row+1,col+1))
for row,col in remove_set:
board[row][col]=""
for idx,row in enumerate(board):
row="".join(row)
board[idx]=[""]*(m-len(row))+list(row)
return board,len(remove_set)
def solution(m, n, board):
answer = 0
board=rotate(board)
while True:
board,cnt=remove_block(board,n,m)
if cnt>0:
answer+=cnt
else:
break
return answer