https://www.acmicpc.net/problem/11559
입력
뿌요뿌요 판의 정보 (12 * 6)
R G B P Y : 색상
. : 빈 공간
출력
연쇄 수 / 없으면 0
초기 값에서는 아래 빈칸 없음
연쇄 == 턴
한 턴에 여러 색이 터지더라도 1연쇄
1. 뿌요가 존재하는 위치 찾기
2. bfs
3. 끌어내리기
BFS를 곁들인 시뮬레이션 문제입니다.
한 턴에 여러 개의 뿌요가 터지더라도 이는 1연쇄로 한다는 점을 잘 숙지하시면 크게 어려운 점이 없습니다.
from collections import deque
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
def print_arr(arrs):
for i in range(len(arrs)):
for j in range(len(arrs[0])):
print(arrs[i][j], end=" ")
print()
def bfs(x, y):
global is_puyo
q = deque()
q.append([x, y, arr[x][y]]) # 위치 및 색상 정보 저장
puyo_data = [] # 연쇄가 일어날 위치 저장
puyo_data.append([x, y])
v = [[False] * 6 for _ in range(12)]
v[x][y] = True
while(len(q) != 0):
px, py, pc = q.popleft()
for d in range(4):
nx = dx[d] + px
ny = dy[d] + py
if nx < 0 or nx >= 12 or ny < 0 or ny >= 6 or v[nx][ny] == True:
continue
if arr[nx][ny] == pc:
q.append([nx, ny, pc])
puyo_data.append([nx, ny])
v[nx][ny] = True
# 4개 이상이면 터뜨리기
if len(puyo_data) >= 4:
is_puyo = True
for nx, ny in puyo_data:
arr[nx][ny] = '.'
def drop():
for j in range(6):
for i in range(11, 0, -1):
if arr[i][j] == '.':
for ii in range(i - 1, -1, -1):
if arr[ii][j] != '.':
arr[i][j] = arr[ii][j]
arr[ii][j] = '.'
break
arr = []
for i in range(12):
arr.append(list(map(str, input().strip())))
ans = 0
while True:
# print_arr(arr)
# print()
is_puyo = False
# 뿌요 존재하는 위치 찾기
for i in range(12):
for j in range(6):
if arr[i][j] != '.':
# bfs
bfs(i, j)
# 끌어내리기
drop()
# 연쇄가 없으면 끝내기
if is_puyo == False:
break
else:
ans += 1
# 빠요엔!
print(ans)
~~
해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.
혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!
python source : https://github.com/ssh5212/conding-test-practice
java source : https://github.com/ssh5212/coding-test-java
[BOJ / 백준] 2805 나무 자르기 (S2^ / 이분탐색) - Python (1) | 2024.06.18 |
---|---|
[BOJ / 백준] 20055 컨베이어 벨트 위의 로봇 (G5 / 시뮬레이션) - Python (0) | 2024.06.16 |
[코드트리] 고대 문명 유적 탐사 (G4^ / 시뮬레이션) - Python (0) | 2024.06.15 |
[BOJ / 백준] 20056 마법사 상어와 파이어볼 (G4^ / 시뮬레이션) - Python (0) | 2024.06.12 |
[Baekjoon] 백준 N과 M 시리즈 1~4 (S3 / 순조부) - JS (2) | 2023.10.23 |