- board의 2x2 블록을 검사하여 삭제 가능하면 포지션 저장(바로 삭제하면 중첩되는 경우 문제)
- 포지션에 따라 2x2 블록 삭제('-'로 치환)
- 열 기준으로 '-' 요소들 붙여줌 (6 6 - - 2 2) -> (- - 6 6 2 2)
'-' 요소 붙여줄 때, -가 아닌 요소들만 순차적으로 리스트에 저장해준 다음, 모자란 개수만큼 - 채워주는 방식으로 구현, 현재 방식은 columns에 열 기준으로 - 제거하여 저장 후 다시 board에 저장하였는데.. 처음부터 board를 행-열 회전시킨 후 진행하였으면 훨씬 수월하였을 것 같음.
from collections import deque
def check(board, m, n):
dx = [0, 0, 1, 1]
dy = [0, 1, 0, 1]
ch = board[m][n]
count = 0
for i in range(4):
x = m + dx[i]
y = n + dy[i]
if x >= 0 and x <= len(board)-1 and y >= 0 and y <= len(board[0])-1:
if board[x][y] == ch:
count += 1
if count == 4:
return True
return False
def remove(board, m, n):
dx = [0, 0, 1, 1]
dy = [0, 1, 0, 1]
for i in range(4):
board[m+dx[i]][n+dy[i]] = '-'
def solution(m, n, board):
board = [list(b) for b in board]
answer = 0
while True:
currect = []
# 2x2 검사
for i in range(m):
for j in range(n):
if board[i][j] == '-':
continue
if check(board, i, j):
currect.append([i, j])
if len(currect) == 0:
# -의 개수 구해줌
for b in board:
answer += b.count('-')
break
# 검사결과 제거
for cur in currect:
remove(board, cur[0], cur[1])
# - 붙여주는 과정
columns = [[] for _ in range(n)]
for j in range(n):
for i in range(m):
if board[i][j] != '-':
columns[j].append(board[i][j])
if len(columns[j]) < m:
columns[j] = ['-'] * (m - len(columns[j])) + columns[j] # 길이 '-' 붙여서 맞추어줌
# - 제거한걸 원래 board에 적용
for i in range(m):
for j in range(n):
board[i][j] = columns[j][i]
return answer
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
'알고리즘[Python] > 프로그래머스' 카테고리의 다른 글
[ Lv 2 ] 점프와 순간 이동 (0) | 2021.06.28 |
---|---|
[ Lv 2 ] 주식가격 (0) | 2021.06.28 |
[ Lv 2 ] 영어 끝말잇기 (0) | 2021.06.27 |
[ Lv 2 ] 구명보트 (0) | 2021.06.27 |
[ Lv 2 ] 다리를 지나는 트럭 (0) | 2021.06.26 |