ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 블록 게임
    코딩 테스트/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 구문이 없어서... 

    반응형
Designed by Tistory.