[프로그래머스] 프렌즈4블록

co_mong·2021년 10월 17일
0

Algorithm

목록 보기
2/4
post-thumbnail

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

0개의 댓글