[プログラマー]友達4ブロック


質問する


同じ形のカカファインダーブロックが2×2の形で貼られていると、消えて点数を取るゲームです.

入力フォーマット

  • 入力入力入力ボードの高さmnとボードのレイアウト情報boardが入力されます.
  • 各文字は、ライアン(R)、ムージ(M)、アピチ(A)、フロド(F)、ニオ(N)、テバー(T)、ジェシー(J)、コンニ(C)
  • を含む.
  • 2 <= n , m <= 30
  • boardは、長さnの文字列mからなる.ブロックを表す文字は大文字AでZを使用します.
  • 出力フォーマット


    指定したレイアウト情報を入力し、消去するブロックを出力します.

    コード#コード#

    from copy import deepcopy
    def solution(m, n, board):
        answer = 0
        board = [ list(x) for x in board]
        
        while True:
            # 블록 제거
            num = pop(m, n, board)
            if num == 0: # 더이상 제거할 칸이 없는 경우
                break
            answer += num
            # 밑으로 이동
            moveDown(m, n, board)
        return answer
    
    def pop(m, n, board):
        status = [[0] * n for _ in range(m)]
        for i in range(m-1):
            for j in range(n-1):
                if board[i][j] != '-' and board[i][j] == board[i+1][j] and board[i][j] == board[i][j+1] and board[i][j] == board[i+1][j+1]:
                    status[i][j]=status[i+1][j]=status[i][j+1]=status[i+1][j+1] = -1
        
        result = 0
        for i in range(m):
            for j in range(n):
                if status[i][j] < 0:
                    result += 1
                    board[i][j] = "-"
        return result
    
    def moveDown(m, n, board):
        for j in range(n):
            row = m-1
            for i in range(m-1,-1,-1):
                if board[i][j] != '-':
                    if row != i:
                        board[row][j] = board[i][j]
                        board[i][j] = '-'
                    row -= 1