[프로그래머스 LV2] 프렌즈 4블록

Junyoung Park·2021년 12월 22일
0

코딩테스트

목록 보기
6/631

1. 문제 설명

프렌즈 4블록

2. 문제 분석

특정 좌표를 중심으로 4블록의 일치 여부를 확인한다. 4블록이 모두 같을 때 각 좌표를 집합에 추가하는데, 삭제가 한 번에 이루어지므로 블록을 모두 확인한 이후에 처리해야 한다. 이후 집합에서 좌표값을 꺼내 각 원소를 공백으로 바꿔준다. 블록 삭제 이후 공백이 된 칸 위에 블록이 존재한다면 이를 내려야 하는데, 큐를 통해 빈 좌표값을 계속 추가해주었다. 이때 특정 x 좌표에서 모든 높이를 검사한 이후 큐를 clear하는 것에 주의. 삭제할 블록이 없을 때 while 문을 break하고 여태까지 더한 블록 수를 return한다.

3. 나의 풀이

from collections import deque
def solution(m, n, board):
   
   
   block_pos = set()
   total = 0
   queue = deque()
   
   while(True):
       
       for i in range(m-1):
           for j in range(n-1):
               if board[i][j] == ' ':
                   continue
               elif board[i][j] == board[i][j+1] and board[i][j] == board[i+1][j] and board[i][j] == board[i+1][j+1]:
                   block_pos.add((i, j))
                   block_pos.add((i, j+1))
                   block_pos.add((i+1, j))
                   block_pos.add((i+1, j+1))
       
       if not block_pos: break
       
       total += len(block_pos)
   
       for block in sorted(block_pos):
           x, y = block
           board[x] = board[x][:y] + ' ' + board[x][y+1:]
   
       block_pos.clear()
   
       for j in range(n):
           for i in range(m-1, -1, -1):
               if board[i][j] == ' ':
                   queue.append([i, j])
               elif queue:
                   x, y = queue.popleft()
                   board[x] = board[x][:y] + board[i][j] + board[x][y+1:]
                   board[i] = board[i][:j] + ' ' + board[i][j+1:]
                   queue.append([i, j])
           queue.clear()
   return total

NOTE: 큐를 사용하는데 익숙해지자. clear를 하면 좀 더 깔끔하게 사용할 수 있다. 문자열을 변환할 때에는 인덱스보다 슬라이싱을 활용하자.

profile
JUST DO IT

0개의 댓글