https://programmers.co.kr/learn/courses/30/lessons/17679
✔ 풀이
한 turn에서 없앨 수 있는 블록을 한번에 모아모아서 없애기 -> 밑으로 내리기
겹쳐져 있는 블록을 위해서 0으로 만드는 작업을 lst배열에 모아 한번에 한다.
블록을 모으는 lst배열이 비어있다면 작업들을 끝내고 0의 갯수(=없어진 블록의 갯수)를 센다.
check 함수 👉 board의 모든 좌표에서 ➡ ↘ ⬇ 좌표를 확인하고 set에 넣어서 4개 모두 같은 값인지 확인
del_down 함수 👉 없애야 하는 블록을 0으로 만들고, 열을 기준으로 비교하면서 밑으로 내린다.
def check(m, n, B):
lst = []
dx, dy = [0, 0, 1, 1], [0, 1, 1, 0]
for i in range(m-1):
for j in range(n-1):
if B[i][j] != 0:
ck_set = set()
for k in range(4):
ck_set.add(B[i + dx[k]][j + dy[k]])
if len(ck_set) == 1:
for k in range(4):
lst.append([i + dx[k], j + dy[k]])
return lst
def del_down(m, n, B, lst):
for i in lst:
B[i[0]][i[1]] = 0
for _ in range(m):
for j in range(n):
for i in range(m-1):
if B[i][j] != 0 and B[i+1][j] == 0:
B[i][j], B[i+1][j] = 0, B[i][j]
return B
def solution(m, n, board):
B = [list(i) for i in board]
while True:
lst = check(m, n, B)
if not lst:
break
B = del_down(m, n, B, lst)
answer = 0
for ans in B:
answer += ans.count(0)
return answer
'알고리즘 > 프로그래머스(Python)' 카테고리의 다른 글
해시 - 전화번호 목록 / 파이썬 (0) | 2020.10.30 |
---|---|
[알고리즘] 프로그래머스 비밀지도 / python, 비트연산자 (0) | 2020.05.07 |
[알고리즘] 프로그래머스 뉴스 클러스터링 / python (0) | 2020.05.05 |
[알고리즘] 프로그래머스 징검다리 건너기 / python (0) | 2020.05.04 |
[알고리즘] 프로그래머스 튜플 / python (0) | 2020.04.28 |