알고리즘 문제 풀이/Programmers

[21회차] 프렌즈 4블록

중앙백 2022. 1. 4. 14:53

Programmers Level.2 프렌즈 4블록

def check(r, c, array): # array의 r행 c열이 지워지는 블록인지 판단
    if array[r][c] == array[r+1][c] and array[r][c] == array[r][c+1] and array[r][c] == array[r+1][c+1]:
        return True


def solution(m, n, board): # m * n size board
    answer = 0
    array = [[''] * m for _ in range(n)] # board를 시계방향으로 90 회전하여 n * m size array로 만들자
    for i in range(m):
        for j in range(n):
            array[j][m - 1 - i] = board[i][j]
    n_array = [[] for _ in range(n)]
    while True:
        n_array = [[] for _ in range(n)]
        for r in range(n):
            for c in range(m): # 각 칸 마다 지워지는지 여부를 판단
                if r < n - 1 and c < m - 1:
                    if check(r,c,array):
                        continue
                if r < n - 1 and c > 0:
                    if check(r,c-1,array):
                        continue
                if r > 0 and c < m - 1:
                    if check(r-1,c,array):
                        continue
                if r > 0 and c > 0:
                    if check(r-1,c-1,array):
                        continue
                n_array[r].append(array[r][c]) # 지워지지 않으면 n_array에 추가
            while len(n_array[r]) < m: # n * m size를 유지하기 위해 빈칸 추가
                n_array[r].append('')
        if n_array == array: # 변동이 없을 경우(더 이상 지워지는 칸이 없는 경우)
            break
        array = n_array
    for a in array:
        answer += a.count('') # 빈 칸의 개수를 세서 반환
    return answer

 - 문제에서는 m * n 크기의 리스트로 주어졌는데 나는 n * m 크기의 리스트로 바꿔서 생각했다. 이게 더 직관적이고 쉽게 느껴졌기 때문.

 - 각 칸 마다 2 * 2 사이즈의 블록을 구성해서 칸이 지워지는지 여부를 판단하고 지워지지 않는 칸일 경우에만 새로운 리스트(n_array)에 추가하는 방식으로 구현했다. 매 시행마다 n * m 크기를 유지하기 위해 빈칸('')을 추가해줬다.

 - while문 내에서 array의 변동이 없을 경우(더 이상 지워지는 칸이 없을 경우) while문을 그만두고 빈 칸의 개수를 세서 반환하면 정답.