Skip to content

Commit d11a0bc

Browse files
committed
refact: 프렌즈4블록 문제 코드 개선
1 parent c9eee97 commit d11a0bc

File tree

1 file changed

+55
-37
lines changed

1 file changed

+55
-37
lines changed
Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,63 @@
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

3545
def 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

Comments
 (0)