BOJ#11559: 골드4/ Puyo Puyo

문제 링크 : https://www.acmicpc.net/problem/11559

🔍 Inspection

문제 접근

🚩 FLOW

코드를 풀이할 때 적었던 플로우가 있나요?

  1. 해당 turn에서 전체 field 속 뿌요뿌요가 있는 위치 확인

    1-2) BFS로 같은 색상의 뿌요가 4개 이상 연결되있는지 확인하기

    -BFS로 연결 개수 확인

    -만약, 4개 이상이면 field 에서 비우고(.) , 변환 flag 을 True 변환

    1-3) 전체 field 돌고 나서 flag = True (한 번이라도 터지면 )이면
    ⇒ 전체 field 돌면서 공중에 떠있는 뿌요뿌요 내리기(함수 refine_field) flag = False 이면 → 종료

🚩제출한 코드

"""
20.19
<https://www.acmicpc.net/problem/11559>
BOJ.#11559_Gold4

#problem
- goal) 연쇄 "연속" 횟수 구하기
[condition]
- 1연쇄 : 해당 turn 에서 상하좌우 4개 연결 -> 삭제 
- 삭제 후 위에 있는 element 는 하강 

- 입력: 현 filed 상황(12x6)
   .(빈공간) / R, G, B, P, Y

   - 빈공간 : 0 
   - 색상 : R,G, B, P, Y = 1,2,3,4,5
[flow] # BFS
1. 상하좌우 연쇄 확인
- 연쇄 확인 
- 삭제
- 연쇄 횟수 증가

......
......
......
......
......
......
......
......
.Y....
.YG...
RRYG..
RRYGG.
"""
import sys
from collections import deque
input = sys.stdin.readline
#1. field 현황 리스트에 담기
# field = [[0]* 6 for _ in range(len(12))]
field = [list(input())[:-1] for _ in range(12)]

#2. bfs
dy = [-1,1,0,0]
dx =[0,0,-1,1]

def refine_field(x) : # 중간 빈자리
  stack = deque()
  #1.아레=> 위로 스택에 뿌요뿌요 순서대로 축척하기 
  for ny in range(11, -1,-1):
    if field[ny][x] != ".":
      stack.append(field[ny][x])
  for ny in range(11, -1, -1) :
    if stack : 
       field[ny][x] = stack.popleft()
    else :
      field[ny][x] = "."

# 연쇄 확인 및 터짐
def bfs(sy,sx):
  q = deque()
  q.append([sy,sx])
  pop_positions = [[sy,sx]]
  cur_color = field[sy][sx]
  visited.append([sy,sx])
  while q : 
    cy,cx = q.popleft()
    for d in range(4):
      ny ,nx = cy + dy[d] ,cx + dx[d]
      # 같은 색상 -> 삭제 등록하기
      if 0<= ny<12 and 0<= nx < 6 and [ny,nx] not in visited  and field[ny][nx] == cur_color :
        q.append([ny,nx])
        pop_positions.append([ny,nx])
        visited.append([ny,nx])
  
  #2) 터짐 확인
  if len(pop_positions) >= 4 :
    for y,x in pop_positions : 
      field[y][x] = "."
    return True
  return False# 안 터짐

answer = 0 
flag = True
k = 0 
while flag  :
  visited = []
  flag =False
  #1. 전체 field에서 뿌요뿌요 탐색
  for i in range(12):
    for j in range(6):
      if field[i][j]!="." and [i,j] not in visited:
        now_f = bfs(i,j) # 2.해당 위치에서 터짐 여부 확인
        flag = flag or now_f
  #2. 연쇄 계수 추가
  if not flag : # False - 안터짐
    break
  else :
    for row in range(6):
        refine_field(row)
  # 현재 turn 에서 1번 이상 터짐
  answer += 1
print(answer)

🚩결과

image.png

💡TIL

배운 점이 있다면 입력해주세요 , (회고는 추가)