본문 바로가기

알고리즘/프로그래머스

프로그래머스 2018 카카오 코딩테스트 - 프렌즈4블록, 파이썬

1. 문제

- 애니팡같이 블럭을 없애는 게임을 구현하는 것

 

2. 풀이

- 요구하는 구현이 그렇게 어렵지는 않다

- 없어지는 블록 찾기, 찾으면 블록 없애주기, 없어지면 위에 블록 당겨주기, 가능한 블록 다 없앴으면 그동안 제거한 블록 리턴

- 답을 내는 건 쉬웠는데 코드가 다소 지저분하다. 

 

3. 코드

# 없어지는 블록을 0으로 구현했기 때문에 0을 제외한 4개가 같으면 True
def check_block(board, i, j) :
    if board[i][j] == 0:
        return False
    if board[i][j] == board[i+1][j+1] == board[i+1][j] == board[i][j+1] :
        return True
    return False
# 없어지는 블록을 0으로 구현
def del_b(board, i, j) :
    board[i][j] = 0
    board[i+1][j+1] = 0
    board[i+1][j] = 0
    board[i][j+1] = 0
    return
# 비어있는 블록(=0)이 있으면 블록을 당겨주는 함수
def set_b(board) :
    for i in range(len(board)) :
        left = []
        right = []
        for j in range(len(board[0])):
            if board[i][j] == 0:
                left += [0]
            else :
                right += [board[i][j]]
        board[i] = left + right
    return

def solution(m, n, board):
	# 빈 블록을 당겨주는 구현때문에 행과 열을 바꿔주었음
    b_r = [[board[y][x] for y in range(m)] for x in range(n)]
    # sign으로 더이상 가능한 블록이 없을 때까지 체크
    sign = 1
    d = set()
    while sign:
        sign = 0
        for i in range(n - 1) :
            for j in range(m - 1) :
                if check_block(b_r, i, j) :
                    sign = 1
                    # 삭제해야할 블록들을 체크해줌
                    d.add((i,j))
        while d :
            i, j = d.pop()
            del_b(b_r, i, j)
        set_b(b_r)
    answer = 0
    # 0인 블록의 수를 체크
    for i in range(n) :
        for j in range(m) :
            if b_r[i][j] == 0 :
                answer += 1
    return answer