[백준] 11559(파이썬) - Puyo Puyo

resilient

·

2021. 8. 7. 15:53

728x90
반응형

https://www.acmicpc.net/problem/11559

 

11559번: Puyo Puyo

총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.

www.acmicpc.net

  • 이 문제는 구현 문제로 문제에서 주어진 대로 하나하나 차근차근 풀면 해결되는 문제였다.
  • 어려운 알고리즘이나 논리는 생각하지 않아도 됐던 거 같다.
  • 나는 4칸 이상일 때 뿌요들을 지워주는 함수 하나,  그리고 뿌요가 4개 이상이 뭉쳐서 사라진 뒤 중력에 의해 아래로 뿌요들을 내려주는 함수 하나, 그리고 뿌요들을 4개 이상인지 확인하기 위해 BFS를 사용한 함수 하나 이렇게 만들었다.
  • temp라는 리스트를 하나 만들어주고, BFS함수가 실행될 때마다 연결된 뿌요들을 넣어주면서 temp의 길이가 4 이상, 즉 4개 이상의 뿌요가 뭉쳤을 때 flag를 1로 바꿔주고, flag가 1일 경우 뿌요들을 삭제하고 ans을 1 올려주고, 삭제 한자리에 뿌요들을 내려주면 1개의 턴이 완성된다.
  • flag가 0이면 더이상 사라질 뿌요들이 없다는 말이기 때문에 break을 사용해서 while문을 빠져나오면 된다.
import sys
from collections import deque
input = sys.stdin.readline

data = [list(input().rstrip()) for _ in range(12)]

dx = [1,-1,0,0]
dy = [0,0,1,-1]

# 아래로 당기는 함수하나
def down():
    for i in range(6):
        for j in range(10, -1, -1):
            for k in range(11, j, -1):
                if data[j][i] != "." and data[k][i] == ".":
                    data[k][i] = data[j][i]
                    data[j][i] = "."
                    break
                           

# 4칸 확인하는 함수 하나
def bfs(x,y):
    q = deque()
    q.append((x,y))
    temp.append((x,y))
    while q:
        a,b = q.popleft()
        for i in range(4):
            nx = a + dx[i]
            ny = b + dy[i]
            if 0<= nx < 12 and 0<= ny < 6 and data[nx][ny] == data[x][y] and visited[nx][ny] == 0:
                q.append((nx,ny))
                temp.append((nx,ny))
                visited[nx][ny] = 1

# 4칸이상일 때 지우는 함수하나
def delete(temp):
    for a,b in temp:
        data[a][b] = "."

# def show(data):
#     for i in range(12):
#         print(data[i],end="\n")

ans = 0
while 1:
    flag = 0
    visited = [[0]*6 for _ in range(12)]
    for i in range(12):
        for j in range(6):
            if data[i][j] != '.' and visited[i][j] == 0:
                visited[i][j] = 1
                temp = []
                bfs(i,j)
                # 4칸확인
                if len(temp) >= 4:
                    flag = 1
                    delete(temp)
    if flag == 0:
        break
    down()
    ans += 1

print(ans)
반응형