[Programmers/프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차 코딩테스트]
- [Lv. 1] 비밀 지도
- [Lv. 1] 다트 게임
- [Lv. 2] 캐시
- [Lv. 3] 셔틀버스
- [Lv. 2] 뉴스 클러스터링
- [Lv. 2] 프렌즈4블록
- [Lv. 3] 추석 트래픽
def erase(m, n, board):
erase_list = []
for row in range(n - 1): # 전치행렬, m 폭 -> 높이
for col in range(m - 1): # 전치행렬, n 높이 -> 폭
if board[row][col] == board[row][col+1] == board[row+1][col] == board[row+1][col+1] != 'X':
# 현재위치(좌상단)을 기준으로 주변 4개 블록이 같고, 이미 지워진 블록이 아니면
erase_list.append((row, col)) # 좌상단
erase_list.append((row, col + 1)) # 우상단
erase_list.append((row + 1, col)) # 좌하단
erase_list.append((row + 1, col + 1)) # 우하단
erase_set = set(erase_list) # 겹치는 블록 중복 카운팅 방지
for row, col in erase_set: # 지워야 하는 블록에 대해
board[row][col] = 0 # 일단 0으로 처리
for idx, row in enumerate(board): # 보드의 각 행에 대해
empty = ['X'] * row.count(0) # 왼쪽, 지운 개수만큼의 'X' 블록
board[idx] = empty + [elem for elem in row if elem != 0] # 오른쪽, 안 지운 블록의 묶음
return len(erase_set)
def solution(m, n, board):
# 인덱스 슬라이싱을 통해 떨어지는 블록을 구현
board = [list(x) for x in zip(*board)] # 전치행렬
answer = 0
while True:
erase_cnt = erase(m, n, board) # 지워진 블록의 개수
answer += erase_cnt # 합산
if erase_cnt == 0: # 더 이상 지울 수 있는 블록이 없다면
break # 정지
return answer