[프로그래머스] 블록 게임
https://programmers.co.kr/learn/courses/30/lessons/42894
코딩테스트 연습 - 블록 게임
[[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,4,0,0,0],[0,0,0,0,0,4,4,0,0,0],[0,0,0,0,3,0,4,0,0,0],[0,0,0,2,3,0,0,0,5,5],[1,2,2,2,3,3,0,0,0,5],[1,1,1,0,0,0,0,0,0,5]] 2
programmers.co.kr
열심히 풀었다.
문제에서 제거가 가능한 모양은 5가지이다.
1)
1 0 0
1 1 1
2)
0 1
0 1
1 1
3)
0 0 1
1 1 1
4)
1 0
1 0
1 1
5)
0 1 0
1 1 1
이며 또한, 제거가 가능하게 하려면 위의 보기에서 '0' 에 해당하는 열에서 '1' 위로의 모든 블록은 가장 위에서 떨어지는 검은 블록에 의해서 직사각형이 되어야 제거되므로 '0' 이어야 한다.
이 부분을 figureCheck 함수를 만들어 구현하였고, 제거되었다면 제거되는 좌표들을 array 에 담도록 하였다. 제거되었으므로 array 에 있는 좌표를 받아 board[x][y] = 0 으로 한다.
처음에는 제거할 수 없었지만, 앞의 블록들이 제거됨으로써 제거가 되는 경우가 있는데 이는 최대 두 단계 이전의 열에서까지만 일어날 수 있는 상황으로 i -= 3 (후에 i = i+1 을 해주기 때문에 2가 아닌 3으로 설정) 하였다.
i 가 N = len(board) 와 같아지면 answer 을 반환한다.
def solution(board):
answer = 0
N = len(board)
i = 0
while i < N:
for j in range(N):
if board[j][i] != 0:
array = figureCheck(j, i, board)
if array:
answer += 1
i -= 3
for x, y in array:
board[x][y] = 0
i = i + 1 if i >= 0 else 0
return answer
def figureCheck(x, y, board):
N = len(board)
v = board[x][y]
if x + 1 < N and y + 2 < N:
if [board[x+1][y], board[x+1][y+1], board[x+1][y+2]] == [v, v, v]:
answer = True
for i in range(x+1):
if board[i][y+1] != 0 or board[i][y+2] != 0:
answer = False
break
if answer: return [(x, y), (x+1, y), (x+1, y+1), (x+1, y+2)]
if x - 2 >= 0 and y + 1 < N:
if [board[x-2][y+1], board[x-1][y+1], board[x][y+1]] == [v, v, v]:
answer = True
for i in range(x):
if board[i][y] != 0:
answer = False
break
if answer: return [(x, y), (x-2, y+1), (x-1, y+1), (x, y+1)]
if x + 2 < N and y + 1 < N:
if [board[x+1][y], board[x+2][y], board[x+2][y+1]] == [v, v, v]:
answer = True
for i in range(x+2):
if board[i][y+1] != 0:
answer = False
break
if answer: return [(x, y), (x+1, y), (x+2, y), (x+2, y+1)]
if x - 1 >= 0 and y + 2 < N:
if [board[x][y+1], board[x][y+2], board[x-1][y+2]] == [v, v, v]:
answer = True
for i in range(x):
if board[i][y] != 0 or board[i][y+1] != 0:
answer = False
break
if answer: return [(x, y), (x, y+1), (x, y+2), (x-1, y+2)]
if [board[x][y+1], board[x-1][y+1], board[x][y+2]] == [v, v, v]:
answer = True
for i in range(x):
if board[i][y] != 0 or board[i][y+2] != 0:
answer = False
break
if answer: return [(x, y), (x, y+1), (x-1, y+1), (x, y+2)]
return []
print(solution([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 4, 0, 0, 0], [0, 0, 0, 0, 0, 4, 4, 0, 0, 0], [0, 0, 0, 0, 3, 0, 4, 0, 0, 0], [0, 0, 0, 2, 3, 0, 0, 0, 5, 5], [1, 2, 2, 2, 3, 3, 0, 0, 0, 5], [1, 1, 1, 0, 0, 0, 0, 0, 0, 5]])) # 2