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문을 그만두고 빈 칸의 개수를 세서 반환하면 정답.
'알고리즘 문제 풀이 > Programmers' 카테고리의 다른 글
[23회차] n^2 배열 자르기 (0) | 2022.01.13 |
---|---|
[22회차] 파일명 정렬 (0) | 2022.01.11 |
[20회차] 영어 끝말잇기 (0) | 2021.12.31 |
[19회차] 후보키, 2개 이하로 다른 비트 (0) | 2021.12.29 |
[18회차] 캐시 (0) | 2021.12.28 |
댓글