[Programmers/프로그래머스] 2019 KAKAO BLIND RECRUITMENT [코딩테스트]
- [Lv. 2] 오픈채팅방
- [Lv. 1] 실패율
- [Lv. 2] 후보키
- [Lv. 4] 무지의 먹방 라이브
- [Lv. 3] 길 찾기 게임
- [Lv. 3] 매칭 점수
- [Lv. 4] 블록 게임
📌 문제




📝 제한사항

💻 입출력 예

📖 입출력 예에 대한 설명

📌 풀이
from collections import deque
BLOCKS = [
{(0, 0), (1, 0), (1, 1), (1, 2)},
{(0, 1), (1, 1), (2, 0), (2, 1)},
{(0, 0), (1, 0), (2, 0), (2, 1)},
{(0, 2), (1, 0), (1, 1), (1, 2)},
{(0, 1), (1, 0), (1, 1), (1, 2)},
]
def BFS(sx, sy, visited, board):
n = len(visited)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
visited[sx][sy] = True
block = [[sx, sy]]
block_type = board[sx][sy]
queue = deque([(sx, sy)])
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny]:
if board[nx][ny] == block_type:
visited[nx][ny] = True
block.append([nx, ny])
queue.append((nx, ny))
return block
def is_possible_remove(block, board):
minX = min([x for x, y in block])
minY = min([y for x, y in block])
standard_block = set([(x - minX, y - minY) for x, y in block])
if standard_block in BLOCKS:
if not is_blind_above(block, board):
return True
return False
def is_blind_above(block, board):
blockYs = [y for x, y in block]
check_block = [[x, y] for x, y in block if blockYs.count(y) == 1]
for x, y in check_block:
x -= 1
while 0 <= x:
if 0 != board[x][y]:
return True
x -= 1
return False
def remove_block(block, board):
for x, y in block:
board[x][y] = 0
def check_board(board):
n = len(board)
visited = [[False] * n for _ in range(n)]
result = 0
for row in range(n):
for col in range(n):
if board[row][col] != 0 and not visited[row][col]:
block = BFS(row, col, visited, board)
if is_possible_remove(block, board):
result += 1
remove_block(block, board)
return result
def solution(board):
answer = 0
remove_block_cnt = -1
while remove_block_cnt != 0:
remove_block_cnt = check_board(board)
answer += remove_block_cnt
return answer