https://programmers.co.kr/learn/courses/30/lessons/17679
코딩테스트 연습 - [1차] 프렌즈4블록
프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙
programmers.co.kr
1. 지워야 하는 블록을 찾아서 c 에 True로 표시한다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다. 같은 게 없다면 break 한다.
2. 지워야 하는 블록을 'a'으로 변경해준다.
3. 아래에 공백이 생긴 경우 블록을 내려준다. 이때, 움직이는 대상이 없어질 때까지 이동시킨다.
1-3의 과정을 더 이상 옮길게 없고 지워지는 블록도 없을 때까지 반복한다.
def process(n,m,a):
# 4칸 같은 게 있는 지 체크
c=[[False]*m for _ in range(n)]
# 같은 게 있으면 True
ok=False
# board 탐색 - 같은 4개 찾기
for x in range(n-1):
for y in range(m-1):
if a[x][y]!="a" and a[x][y] == a[x+1][y] == a[x][y+1] == a[x+1][y+1]:
c[x][y] = c[x+1][y] = c[x][y+1] = c[x+1][y+1]=True
ok=True
return ok,c
def solution(m, n, board):
n,m=m,n
answer = 0
a=[[0] * m for _ in range(n)]
for i in range(len(board)):
a[i]=list(board[i])
while True:
ok,c = process(n,m,a)
# 같은 게 없다면 break
if not ok:
break
# c에서 True 인 같은 것들 없애기(a로 변환)
for x in range(n):
for y in range(m):
if c[x][y]:
a[x][y] = "a"
# 같은 블록의 개수 answer에 더하기
answer+=1
# board 에서 'a'인 칸들 무시하고 블럭 떨어뜨리기
cnt = 1
while cnt: # 움직이는 대상이 더 없어 0이 될 때까지
cnt=0 # 움직이는 대상의 수
for x in range(n-1):
for y in range(m):
if a[x][y]!="a" and a[x+1][y]=="a":
a[x][y],a[x+1][y] = a[x+1][y],a[x][y]
cnt+=1
return answer