[프로그래머스] 프렌즈4블록 풀이_ 2018 KAKAO BLIND RECRUITMENT



1. 문제

https://programmers.co.kr/learn/courses/30/lessons/17679

2. 풀이

  • 시뮬레이션을 이용하여 풀면 되는 문제입니다.
  • 상세 풀이는 주석을 통하여 정리하였습니다.
def solution(m, n, board):
    new_board = [list(x) for x in board]
    delete_list = []
    while True:
        # 4개 일치하는 영역 찾고 배열에 넣기
        for r_idx in range(m - 1):
            for c_idx in range(n - 1):
                if new_board[r_idx][c_idx] == 0:
                    continue
                if new_board[r_idx][c_idx] == new_board[r_idx + 1][c_idx] == new_board[r_idx][c_idx + 1] == \
                        new_board[r_idx + 1][c_idx + 1]:
                    delete_list.append((r_idx, c_idx))

        # 4개 일치하는 영역 없으면 턴 종료
        if len(delete_list) == 0:
            break

        # 지워야 할 영역을 0으로 채워버림
        for left_top in delete_list:
            r_idx, c_idx = left_top
            new_board[r_idx][c_idx] = new_board[r_idx + 1][c_idx] = new_board[r_idx][c_idx + 1] = new_board[r_idx + 1][
                c_idx + 1] = 0
        delete_list = []

        # 공중에 떠있는 요소들을 밑으로 내려버리기 
        for c_idx in range(n):
            top_r_idx = m
            for r_idx in range(m - 1, -1, -1):
                if new_board[r_idx][c_idx] != 0:
                    if top_r_idx - 1 != r_idx:
                        new_board[top_r_idx - 1][c_idx] = new_board[r_idx][c_idx]
                        new_board[r_idx][c_idx] = 0
                    top_r_idx = top_r_idx - 1
                    
    ## 개수 체크 
    answer = 0
    for r_idx in range(m):
        for c_idx in range(n):
            if new_board[r_idx][c_idx] == 0:
                answer += 1
    return answer