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-
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
1421 for i in range (m ):
1522 for j in range (n ):
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-
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 ] = ""
3444
3545def solution (m , n , board ):
36- answer = 0
37- board = list (map (list , board ))
46+ # 1. 입력 문자열을 2D 리스트로 변환
47+ grid = [list (row ) for row in board ]
48+ total_removed = 0
3849
3950 while True :
40- temp = check (m , n , board )
41- if temp == 0 :
51+ # 2. 지울 칸 표시
52+ mark = check_remove (m , n , grid )
53+ # 3. 표시된 칸 삭제 및 개수 세기
54+ removed = remove_blocks (m , n , grid , mark )
55+ if removed == 0 :
56+ # 더이상 지울 블록이 없다면 반복 종료
4257 break
43- answer += temp
58+ # 4. 전체 삭제 개수에 해당 칸의 삭제 개수 누적해서 더하기
59+ total_removed += removed
60+ # 5. 중력 적용
61+ down_blocks (m , n , grid )
4462
45- return answer
63+ return total_removed
0 commit comments