# 블록게임
import copy
dx = [[0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 2, 2]]
dy = [[0, 1, 2, 0, 1, 2], [0, 1, 0, 1, 0, 1]]
answer = 0
def solution(board):
N = len(board)
global answer
while True:
if not drop_block(board):
break
return answer
def drop_block(arr):
N = len(arr)
for j in range(N):
for i in range(N):
if arr[i][j] == -1:
continue
if arr[i][j] != 0:
break
arr[i][j] = -1
return check(arr)
def check(arr):
N = len(arr)
for i in range(N):
for j in range(N):
isBreak = True
if arr[i][j] != 0:
t = -1
temp = 0
for k in range(len(dx[0])):
nx = i + dx[0][k]
ny = j + dy[0][k]
if 0 <= nx < N and 0 <= ny < N:
if arr[nx][ny] == 0:
isBreak = False
break
elif arr[nx][ny] != -1:
if t == -1:
t = arr[nx][ny]
elif arr[nx][ny] != t:
isBreak = False
break
temp += 1
else:
isBreak = False
if not isBreak:
break
if temp != 4:
isBreak = False
if isBreak:
break_block(arr, i, j, 0)
return True
isBreak = True
if arr[i][j] != 0:
t = -1
temp = 0
for k in range(len(dx[1])):
nx = i + dx[1][k]
ny = j + dy[1][k]
if 0 <= nx < N and 0 <= ny < N:
if arr[nx][ny] == 0:
isBreak = False
break
elif arr[nx][ny] != -1:
if t == -1:
t = arr[nx][ny]
elif arr[nx][ny] != t:
isBreak = False
break
temp += 1
else:
isBreak = False
if not isBreak:
break
if temp != 4:
isBreak = False
if isBreak:
break_block(arr, i, j, 1)
return True
return False
def break_block(arr, x, y, k):
global answer
for t in range(len(dx[k])):
nx = x + dx[k][t]
ny = y + dy[k][t]
arr[nx][ny] = 0
answer += 1
2019 카카오 블라인드 - 7번
dx[0], dy[0] 세로가 긴 직사각형
dx[1], dy[1] 가로가 긴 직사각형
1. dop_block : 조건에 맞게 블록을 넣을 수 있는 모든 곳에 -1로 초기화
2. check : 직사각형이 같은 숫자 4개와 -1 2개로 이루어졌는지 체크 맞다면 break_block실행, return True
3. break_block : 해당 직사각형을 전부 0으로 초기화
차라리 이런 구현이 쉽다
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv1 - 로또의 최고 순위와 최저 순위 (파이썬) (0) | 2022.03.15 |
---|---|
[프로그래머스] Lv1 - 신고 결과 받기 (파이썬) (0) | 2022.03.15 |
[프로그래머스] - 매칭점수 (파이썬) (0) | 2022.02.15 |
[프로그래머스] - 길 찾기 게임 (파이썬) (0) | 2022.02.15 |
[프로그래머스] - 무지의 먹방 라이브 (파이썬) (0) | 2022.02.15 |