[Programmers] 프렌즈4블록

김가영·2021년 2월 14일
0

Algorithm

목록 보기
49/78
post-custom-banner

문제 바로가기

# 지워지는 블록이 몇 개인지
def solution(m, n, board):
    
    board = [list(i) for i in board]
    
    
    def find4(board):
        deleted = []
        for i in range(m - 1):
            for j in range(n - 1):
                if board[i][j] != '0' and board[i][j] == board[i+1][j] == board[i][j+1] == board[i+1][j+1]:
                    deleted.append([i,j])
        return deleted
    
    def delete4(board, ls):
        d = []
        for dot in ls:
            x,y = dot
            for i,j in ((x,y),(x+1,y),(x,y+1),(x+1,y+1)):
                if board[i][j] != '0':
                    d.append((i,j))
                    board[i][j] = '0'
        return d
    def move(ls):
        ls.sort(key = lambda x: x[1])
        for (y,x) in ls:
            for k in range(y-1, -1, -1):
                if board[k][x] != '0':
                    board[y][x] = board[k][x]
                    board[k][x] = '0'
                    y-=1

    while True:
        d_list = find4(board)
        if not d_list:
            break
        d = delete4(board, d_list)
        move(d)
    return sum(board, []).count('0')

find4 : 전체 board 를 돌며 0(비어있는 칸)이 아니면서, 해당 블록을 좌상향으로 하는 4칸이 일치하는 좌표를 찾아 list 에 넣는다.

delete4 : find4 에서 찾은 좌표들을 이용하여 이를 좌상향으로 하는 4칸 블록을 '0'(비어있는 칸)으로 바꾼다. find4 에서 동시에 해주지 않은 이유는, 4칸 블록을 찾자마자 지워버리면 겹치는 사각형을 모두 지우지 못하기 때문이다.

move : 모두 터지고 난 후 블록을 다시 채우는 과정이다

'0' 을 넣어줄 것을 0 을 넣어줘서 에러가 났었다. 바보

profile
개발블로그
post-custom-banner

0개의 댓글