Algorithm/Python

[파이썬/프로그래머스][1차]프렌즈4블록

박한결 2021. 4. 10. 17:01

💬 문제 설명

 

블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록".
같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.

입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.

 

💬 코드 

def solution(m, n, board):
    answer = 0
    
    # 지울거 찾기
    def find(board):
        target = set()
        for i in range(m-1):
            for j in range(n-1):
                if board[i][j] and board[i][j] == board[i][j+1] == board[i+1][j] == board[i+1][j+1]:
                    target.update({(i, j), (i+1, j), (i, j+1), (i+1, j+1)})
        return target

    # 지우기
    def remove(target, board):
        board = [list(row) for row in board]
        for loc in target:
            i, j = loc
            board[i][j] = ''
        return board

    # 이동하기
    def move(board):
        cnt = 0
        for i in range(m-1):
            for j in range(n):
                if board[i][j] and not board[i+1][j]:
                    board[i][j], board[i+1][j] = board[i+1][j], board[i][j]
                    cnt += 1
        return cnt, board

    while 1:
        target = find(board)
        answer += len(target)
        board = remove(target, board)
        cnt = 1
        while cnt:
            cnt, board = move(board)
        if not cnt and not len(target):
            break

    return answer

1. 지워야 하는 블록을 찾아서 set에 추가해준다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워지기 때문에 set 자료형을 사용한다.

2. 지워야 하는 블록을 ''으로 변경해준다. 원래는 보기 좋으라고 ' '←이렇게 공백을 넣어주려고 했으나, 나중에 이동할 때 코드가 예쁘지않을 것 같아서 ''를 사용했다(' '를 하면 board[i+1][j]==' '라고 해야하는데 ''로 해서 not board[i+1][j]라고 할 수 있음).

3. 아래에 공백이 생긴 경우 블록을 내려준다.

 

1-3의 과정을 더 이상 옮길게 없고 지워지는 블록도 없을 때까지 반복한다.