[백준] 11559(파이썬) - Puyo Puyo
resilient
·2021. 8. 7. 15:53
728x90
반응형
https://www.acmicpc.net/problem/11559
- 이 문제는 구현 문제로 문제에서 주어진 대로 하나하나 차근차근 풀면 해결되는 문제였다.
- 어려운 알고리즘이나 논리는 생각하지 않아도 됐던 거 같다.
- 나는 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)
반응형
'자료구조 & 알고리즘 > 백준(Baekjoon)' 카테고리의 다른 글
[백준] 10830(파이썬) - 행렬 제곱 (0) | 2021.08.10 |
---|---|
[백준] 1062(파이썬) - 가르침 (0) | 2021.08.08 |
[백준] 1806(파이썬) - 부분합 (0) | 2021.08.05 |
[백준] 2638(파이썬) - 치즈 (0) | 2021.08.04 |
[백준] 2096(파이썬) - 내려가기 (0) | 2021.08.03 |