코딩 테스트/Level 4

블록 게임

컴닥 2022. 12. 10. 01:08
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/42894

처음에는 한 줄 한 줄 0과 블록과 빈칸을 따져가면서 코딩했는데.
생각지 못한 케이스가 많아서, 하나를 해결하면 다른 케이스가 문제가 되는 상황. 

방향을 바꿔 문제에서 주어진 데로 코딩해 보았다. 
단, 검은 블록(-1)은 두 개씩 떨어트렸다. 
세로로 된 L자형 블록은 지울 때 검은 블록 2개가 필요하니까..

처음 시도했던 것 보다 구현도 간단하고 깔끔하다. 

보드의 모든 좌표에서 2*3, 3*2 탐색을 하면서 블록을 체크한다. 

6칸의 보드가 기본 블록 4개와 검은 블록  2개로 가득 차 있으면 지울 수 있다.
Counter와 most_common을 이용해서 이를 확인했다. 

이때 구성 블록의 종류는 2종류,
그중 가장 많은 수는 0보다 커야 하며 개수는 4개,
그다음 많은 수는 -1이어야 하며 개수는 2개.

def solution(board):
    from collections import Counter

    def find_block(y, x, dy, dx):
        if y + dy <= len(board) and x + dx <= len(board):
            collection = [board[y + iy][x + ix] for iy in range(dy) for ix in range(dx)]
            most_common = Counter(collection).most_common()
            if len(most_common) == 2:  # 2가지 종류의 블록으로 구성되어야 한다.
                num1, counter1 = most_common[0]  # 4개의 양수
                num2, counter2 = most_common[1]  # 2개의 -1
                if num1 > 0 and counter1 == 4 and num2 == -1 and counter2 == 2:
                    return True
        return False

    def delete_block(y, x, dy, dx):
        for iy in range(dy):
            for ix in range(dx):
                board[y + iy][x + ix] = 0

    def solve():
        answer, count = 0, -1
        while count != 0:
            count = 0
            for x in range(len(board)):  # 검은 블록 떨어트리기
                for y in range(len(board)):
                    if board[y][x] > 0:
                        if y > 0:
                            board[y - 1][x] = -1
                        if y > 1:
                            board[y - 2][x] = -1
                        break
            for x in range(len(board)):  # 지울 수 있는 블록 찾기
                for y in range(len(board)):
                    for dy, dx in ((3, 2), (2, 3)):
                        if find_block(y, x, dy, dx):
                            delete_block(y, x, dy, dx)
                            count += 1
            answer += count
        return answer

    return solve()

파이썬에는 do while 구문이 없어서... 

반응형