[ BOJ / Python ] 11559번 Puyo Puyo

황승환·2022년 5월 12일
0

Python

목록 보기
299/498


이번 문제는 BFS를 통해 현재 위치와 연결된 위치에 자신과 같은 문자가 있는지를 찾고, 같은 문자가 4개 이상이 될 경우에만 방문처리 하도록 하였고, 4개보다 적을 때에는 다시 방문처리를 취소해주었다. 이렇게 해서 방문처리 리스트에 True로 표기되는 위치는 이번 차례에 터지는 위치가 된다. 방문처리 리스트를 순회하며 터트려주고, 리스트의 아래에서부터 확인하며 값이 .이 아닌 경우에 밑으로 값을 깔아서 저장해준다. 저장을 한 경우에는 idx를 1 감소시켜 다음 칸을 가리키도록 하였다. 이렇게 3개의 함수를 따로 구현하여 문제를 쉽게 해결하였다.

Code

import collections
import copy
puyo=[list(str(input())) for _ in range(12)]
answer=0
dy, dx=[0, 1, 0, -1], [1, 0, -1, 0]
def bfs(y, x):
    q=collections.deque()
    q.append((y, x))
    visited[y][x]=True
    path=[(y, x)]
    cnt=1
    while q:
        y, x=q.popleft()
        for i in range(4):
            ny, nx=y+dy[i], x+dx[i]
            if 0<=ny<12 and 0<=nx<6 and puyo[y][x]==puyo[ny][nx] and not visited[ny][nx]:
                q.append((ny, nx))
                path.append((ny, nx))
                cnt+=1
                visited[ny][nx]=True
    if cnt<4:
        for y, x in path:
            visited[y][x]=False
def rmv():
    for i in range(12):
        for j in range(6):
            if visited[i][j]:
                puyo[i][j]='.'
def drop():
    global puyo
    tmp=[['.' for _ in range(6)] for _ in range(12)]
    for i in range(6):
        idx=11
        for j in range(11, -1, -1):
            if puyo[j][i]!='.':
                tmp[idx][i]=puyo[j][i]
                idx-=1
    puyo=copy.deepcopy(tmp)
while True:
    before=copy.deepcopy(puyo)
    visited=[[False for _ in range(6)] for _ in range(12)]
    for i in range(12):
        for j in range(6):
            if puyo[i][j]!='.' and not visited[i][j]:
                bfs(i, j)
    rmv()
    drop()
    if before==puyo:
        break
    answer+=1
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글