728x90
https://programmers.co.kr/learn/courses/30/lessons/17679
- 생각
- 위에서 떨어지는게 아니라 오른쪽에서 왼쪽으로 떨어지도록 돌리기
- 같은 열에서 위에서부터 지우는 것보다 같은 행에서 지우는게 더 편할 것 같아서
- 이번 turn에 터트릴 수 있는 위치 set에 담기
- 중복을 제거하기 위해
- 터트릴 수 있는 위치 0으로 바꾸고 왼쪽으로 떨어지도록 하기
- A C 0 0 C -> A C C 0 0 으로 바꾸기
- 터트릴 수 있는게 0개 일 때까지 반복
- 위에서 떨어지는게 아니라 오른쪽에서 왼쪽으로 떨어지도록 돌리기
- 코드
def solution(m, n, board):
# 위에서 떨어지는게 아니라 오른쪽에서 왼쪽으로 떨어지도록 돌리기
board = list(map(list,zip(*board[::-1])))
poppop_count = 0
# 터트릴게 없을 때까지
while True:
# 이번 turn에 터트린 위치 set
poppop = set()
for r in range(n-1):
for c in range(m-1):
# 2x2 형태로 4개가 같다면 (터트린 위치의 값은 0)
if board[r][c] == board[r+1][c] == board[r+1][c+1] == board[r][c+1] != 0:
# 집합 더하는 방법 set |= set
poppop |= set([(r,c),(r+1,c),(r+1,c+1),(r,c+1)])
# 터트리고 칸 채우기
for i,j in poppop:
board[i][j] = 0
for r in range(n):
zero = []
nonzero = []
for c in range(m):
if board[r][c] == 0:
zero += [0]
else:
nonzero += board[r][c]
board[r] = nonzero + zero
# 이번 turn에 터트린게 없으면 끝내기
if len(poppop) == 0:
break
# 터트린 블록 수 더하기
poppop_count += len(poppop)
return poppop_count
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
[백준] 14501. 퇴사 - Python (0) | 2022.07.03 |
---|---|
[백준] 2667. 단지번호붙이기 - Python (0) | 2022.07.02 |
[프로그래머스] Lv.1 비밀지도 - Python (0) | 2022.06.30 |
[프로그래머스] Lv.2 뉴스클러스터링 - Python (0) | 2022.06.30 |
[프로그래머스] Lv.3 입국심사 - Python (0) | 2022.06.30 |
댓글