728x90
반응형
https://www.acmicpc.net/problem/11559
11559번: Puyo Puyo
총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.
www.acmicpc.net
문제 해결
- 문제 상황을 시물레이션으로 구현할 수 있으면 어렵지 않은 문제
- 첫 행 첫 열부터 하나씩 확인을 해서 이어져 있는 같은 색 뿌요가 4개 이상인지 BFS를 이용해 확인한다.
- 확인한 점은 다시 확인할 필요가 없으므로 visited를 이용해 구별해서 방문 한 지점은 패스한다.
- 이어져 있는 같은색 점이 4개 이상이면 터뜨리면서 빈 공간으로 만든다.
- 모두 한바퀴 확인하면 그 다음 중력으로 인해 밑으로 떨어지는 알고리즘을 만든다. 이는 마지막 행부터 바로 위 행까지 비교를 해가며 특정 지역 행의 y열이 빈 공간이고 그 위에 행의 y열이 뿌요가 있을 때 스위치를 함으로써 뿌요를 아래로 떨어뜨리는 알고리즘을 짤 수 있다.
CODE
import sys
from collections import deque
input = sys.stdin.readline
def down():
for i in range(6):
for j in range(10,-1,-1):
for k in range(11,j,-1):
if board[j][i] != "." and board[k][i] ==".":
board[k][i] = board[j][i]
board[j][i] = "."
break
def bfs(x,y):
que = deque()
que.append((x,y))
temp.append((x,y))
while que:
a, b = que.popleft()
for i in range(4):
nx = a + dx[i]
ny = b + dy[i]
if 0<=nx<12 and 0<=ny<6 and board[nx][ny] == board[x][y] and visited[nx][ny] ==0:
que.append((nx,ny))
temp.append((nx,ny))
visited[nx][ny] = 1
def delete(temp):
for a, b in temp:
board[a][b] = "."
if __name__=='__main__':
board = [list(input().strip()) for _ in range(12)]
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
answer = 0
while 1:
flag = 0
visited =[[0 for _ in range(6)] for _ in range(12)]
for i in range(12):
for j in range(6):
if board[i][j] != '.' and not visited[i][j]:
visited[i][j] = 1
temp = []
bfs(i,j)
if len(temp) >= 4:
flag = 1
delete(temp)
if flag ==0:
break
down()
answer += 1
print(answer)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 1358 하키 (0) | 2023.11.30 |
---|---|
[python] 백준 7579 앱 (0) | 2023.11.26 |
[python] 백준 1726 로봇 (1) | 2023.11.22 |
[python] 백준 18808 스티커 붙이기 (0) | 2023.11.18 |
[python] 백준 14215 세 막대 (0) | 2023.11.17 |
댓글