[KAKAO 2018-4] 프렌즈 4블록 (python / 파이썬)

해리·2021년 9월 18일
# -*- coding: utf-8 -*-

def find_4_blocks(board, x, y, m, n): # (x,y)를 기준으로 4개의 블록이 생기는지 확인

    if x+1 == m or y+1 == n:
        return False
    
    check_set = {board[x][y], board[x+1][y], board[x][y+1], board[x+1][y+1]}
    
    if check_set == {0}:
        return False
    
    if len(check_set) == 1 :
        return True
    else:
        return False


def remove_block(board, count_list, m, n): # 삭제 블록 리스트 파악

    a = []
    # count_list 를 이용해 지우고자 하는 블록을 모두 파악
    for data in count_list:
        x, y = data[0], data[1]
        a.append((x,y))
        a.append((x+1,y))
        a.append((x,y+1))
        a.append((x+1,y+1))
        
    a = set(a) # 중복 제거
    
    for i in range(m):
        for j in range(n):
            for data in a:
                board[data[0]][data[1]] = 0 # 삭제하려는 블록을 0으로 변환
                
    return board

def down_block(board, m, n): # 0 있는 경우 아래로 이동
    
    for j in range(n): 
       count = 0
       temp = []
       for i in range(m):
           if board[i][j] == 0:
               count +=1
           else:
               temp.append(board[i][j])
               
       if count !=0: # 블록 변환 필요 (각 행마다 0의 개수)
           k = 0
           for i in range(m):
               if count != 0:
                   board[i][j] = 0
                   count -= 1
               else:
                   board[i][j] = temp[k]
                   k += 1
                   
    return board        


def solution(m, n, board):    
    answer = 0
    
    for i in range(len(board)):
       board[i] = list(board[i])
    
    count_list = [1]
    
    while (count_list!=[]): # 더 이상 삭제할 수 있는 보드가 없을 때까지 지속
        count_list = []
        for i in range(m):
            for j in range(n):
                if find_4_blocks(board, i, j, m, n): # 주변 4개의 블록이 참일 때
                   count_list.append((i,j))
        
        board = remove_block(board, count_list, m, n) # 보드 변환
        board = down_block(board, m, n)
    
    for i in range(m):
        for j in range(n):
            if board[i][j] == 0: # 0 : 없어진 블록의 개수
                answer += 1
    return answer

solution(4, 5, ["CCBDE", "AAADE", "AAABF", "CCBBF"])
profile
점의 연결

0개의 댓글