1- def check_remove (m , n , grid ):
2- """
3- 2×2 같은 블록을 찾아서, 지울 칸을 True로 표시한 2D 배열을 반환한다.
4- """
5- mark = [[False ] * n for _ in range (m )]
6- for i in range (m - 1 ):
7- for j in range (n - 1 ):
8- current = grid [i ][j ]
9- if current and grid [i ][j + 1 ] == current \
10- and grid [i + 1 ][j ] == current \
11- and grid [i + 1 ][j + 1 ] == current :
12- mark [i ][j ] = mark [i ][j + 1 ] = mark [i + 1 ][j ] = mark [i + 1 ][j + 1 ] = True
13- return mark
14-
15- def remove_blocks (m , n , grid , mark ):
16- """
17- mark 배열이 True인 칸으르 찾아서 빈칸으로 바꾸고,
18- 삭제된 블록의 총 개수를 반환한다.
19- """
20- removed = 0
1+ def check (m , n , board ):
2+ filter = [[0 for _ in range (n )] for _ in range (m )]
3+ count = 0
4+
5+ for i in range (m - 1 ):
6+ for j in range (n - 1 ):
7+ a = board [i ][j ]
8+ b = board [i ][j + 1 ]
9+ c = board [i + 1 ][j ]
10+ d = board [i + 1 ][j + 1 ]
11+ if a == b == c == d and a != '0' :
12+ filter [i ][j ], filter [i ][j + 1 ], filter [i + 1 ][j ], filter [i + 1 ][j + 1 ] = 1 , 1 , 1 , 1
13+
2114 for i in range (m ):
2215 for j in range (n ):
23- if mark [i ][j ]:
24- grid [i ][j ] = ""
25- removed += 1
26- return removed
27-
28- def down_blocks (m , n , grid ):
29- """
30- 중력을 적용하여, 각 열마다 빈칸 위의 블록을 아래로 당긴다.
31- """
32- for j in range (n ):
33- stack = []
34- for i in range (m ):
35- if grid [i ][j ] != "" :
36- stack .append (grid [i ][j ])
37-
38- for i in range (m - 1 , - 1 , - 1 ):
39- if stack :
40- grid [i ][j ] = stack .pop ()
41-
42- else :
43- grid [i ][j ] = ""
16+ if filter [i ][j ] == 1 :
17+ count += 1
18+ board [i ][j ] = '0'
19+
20+ if count == 0 :
21+ return 0
22+
23+ for i in range (m - 2 , - 1 , - 1 ):
24+ for j in range (n ):
25+ k = i
26+ while 0 <= k + 1 < m and board [k + 1 ][j ] == '0' :
27+ k += 1
28+ if k != i :
29+ board [k ][j ] = board [i ][j ]
30+ board [i ][j ] = '0'
31+
32+ return count
33+
4434
4535def solution (m , n , board ):
46- # 1. 입력 문자열을 2D 리스트로 변환
47- grid = [list (row ) for row in board ]
48- total_removed = 0
36+ answer = 0
37+ board = list (map (list , board ))
4938
5039 while True :
51- # 2. 지울 칸 표시
52- mark = check_remove (m , n , grid )
53- # 3. 표시된 칸 삭제 및 개수 세기
54- removed = remove_blocks (m , n , grid , mark )
55- if removed == 0 :
56- # 더이상 지울 블록이 없다면 반복 종료
40+ temp = check (m , n , board )
41+ if temp == 0 :
5742 break
58- # 4. 전체 삭제 개수에 해당 칸의 삭제 개수 누적해서 더하기
59- total_removed += removed
60- # 5. 중력 적용
61- down_blocks (m , n , grid )
43+ answer += temp
6244
63- return total_removed
45+ return answer
0 commit comments