알고리즘 문제 풀이/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문을 그만두고 빈 칸의 개수를 세서 반환하면 정답.