본문 바로가기
Algorithm/프로그래머스

[프로그래머스] - 블록게임 (파이썬)

by 2HS 2022. 2. 15.
# 블록게임
import copy
dx = [[0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 2, 2]]
dy = [[0, 1, 2, 0, 1, 2], [0, 1, 0, 1, 0, 1]]
answer = 0


def solution(board):
    N = len(board)
    global answer

    while True:
        if not drop_block(board):
            break
    return answer


def drop_block(arr):
    N = len(arr)
    for j in range(N):
        for i in range(N):
            if arr[i][j] == -1:
                continue
            if arr[i][j] != 0:
                break
            arr[i][j] = -1
    return check(arr)


def check(arr):
    N = len(arr)
    for i in range(N):
        for j in range(N):
            isBreak = True
            if arr[i][j] != 0:
                t = -1
                temp = 0
                for k in range(len(dx[0])):
                    nx = i + dx[0][k]
                    ny = j + dy[0][k]
                    if 0 <= nx < N and 0 <= ny < N:
                        if arr[nx][ny] == 0:
                            isBreak = False
                            break
                        elif arr[nx][ny] != -1:
                            if t == -1:
                                t = arr[nx][ny]
                            elif arr[nx][ny] != t:
                                isBreak = False
                                break
                            temp += 1
                    else:
                        isBreak = False
                    if not isBreak:
                        break
                if temp != 4:
                    isBreak = False
                if isBreak:
                    break_block(arr, i, j, 0)
                    return True

            isBreak = True
            if arr[i][j] != 0:
                t = -1
                temp = 0
                for k in range(len(dx[1])):
                    nx = i + dx[1][k]
                    ny = j + dy[1][k]
                    if 0 <= nx < N and 0 <= ny < N:
                        if arr[nx][ny] == 0:
                            isBreak = False
                            break
                        elif arr[nx][ny] != -1:
                            if t == -1:
                                t = arr[nx][ny]
                            elif arr[nx][ny] != t:
                                isBreak = False
                                break
                            temp += 1
                    else:
                        isBreak = False
                    if not isBreak:
                        break
                if temp != 4:
                    isBreak = False
                if isBreak:
                    break_block(arr, i, j, 1)
                    return True
    return False


def break_block(arr, x, y, k):
    global answer
    for t in range(len(dx[k])):
        nx = x + dx[k][t]
        ny = y + dy[k][t]
        arr[nx][ny] = 0
    answer += 1

 

2019 카카오 블라인드 - 7번

dx[0], dy[0] 세로가 긴 직사각형

dx[1], dy[1] 가로가 긴 직사각형

1. dop_block : 조건에 맞게 블록을 넣을 수 있는 모든 곳에 -1로 초기화

2. check : 직사각형이 같은 숫자 4개와 -1 2개로 이루어졌는지 체크 맞다면 break_block실행, return True

3. break_block : 해당 직사각형을 전부 0으로 초기화

 

 

차라리 이런 구현이 쉽다