Skip to content

Commit 48ec01b

Browse files
committed
[PGS] 프렌즈4블록 / Level 2 / 1시간 / 실패
1 parent 1454cc9 commit 48ec01b

File tree

1 file changed

+37
-55
lines changed

1 file changed

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

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

Comments
 (0)