<๋ฌธ์ ๋งํฌ>
https://www.acmicpc.net/problem/11559
11559๋ฒ: Puyo Puyo
์ด 12๊ฐ์ ์ค์ ํ๋์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์ค์๋ 6๊ฐ์ ๋ฌธ์๊ฐ ์๋ค. ์ด๋ .์ ๋น๊ณต๊ฐ์ด๊ณ .์ด ์๋๊ฒ์ ๊ฐ๊ฐ์ ์๊น์ ๋ฟ์๋ฅผ ๋ํ๋ธ๋ค. R์ ๋นจ๊ฐ, G๋ ์ด๋ก, B๋ ํ๋, P๋ ๋ณด๋ผ, Y๋ ๋ ธ๋์ด๋ค.
www.acmicpc.net
<ํ์ด ์ ๋ต>
1. ๊ตฌํ๋ฌธ์ ์ด๋ค.
2. ๊ตฌํํด์ผ ํ ์์๋ '๋ธ๋ญ์ด ํฐ์ง๋ ๋ถ๋ถ' + '๋ธ๋ญ์ด ํฐ์ง๊ณ ๋ด๋ ค์ค๋ ๋ถ๋ถ' 2๊ฐ์ง์ด๋ค.
3. ๋ธ๋ญ์ด ํฐ์ง๋ ๋ถ๋ถ์ bfs๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค.
4. ๋ธ๋ญ์ด ํฐ์ง๊ณ ๋ด๋ ค์ค๋ ๋ถ๋ถ์ ์ฌ๋ผ์ด์ฑ์ ์ด์ฉํด ํ ๋จ์์์ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ฐฐ์ด์ ํ์ ์์ผ์ ํ๋ค.
<์ ๋ต ์ฝ๋>
from collections import deque
import sys, os, io, atexit
input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))
# 220920 11559 Puyo Puyo
# ์ ๋ต์ฝ๋
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
# bfs๋ก ๋ฟ์ ํฐํธ๋ฆฌ๋ ํจ์
def bfs(r, c, puyo):
# ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์
visited[r][c] = 1
# ์ธ์ ๋ฟ์ ์ธ์ฃผ๊ธฐ ๋ฐ ๋ฟ์์ ์ขํ ์ ์ฅ
cnt = 1
temp = [(r, c)]
queue = deque()
queue.append((r, c))
while queue:
r, c = queue.popleft()
for i in range(4):
nr = r + dr[i]
nc = c + dc[i]
if 0 <= nr < 12 and 0 <= nc < 6:
# ๊ฐ์ ๋ฟ์์ด๋ฉฐ ๋ฏธ๋ฐฉ๋ฌธ์ผ ๊ฒฝ์ฐ
if board[nr][nc] == puyo and visited[nr][nc] == 0:
# ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์
visited[nr][nc] = 1
# ๋ฟ์ ์ธ์ฃผ๊ธฐ ๋ฐ ์ขํ ์ ์ฅ
cnt += 1
temp.append((nr, nc))
queue.append((nr, nc))
# ์ธ์ ํ ๋ฟ์๊ฐ 4๊ฐ ์ด์์ผ ๊ฒฝ์ฐ
if cnt >= 4:
# ์ ์ฅ๋ ์ขํ์ ๋ฟ์๋ค์ '.'์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
for r, c in temp:
board[r][c] = '.'
# True ๋ฐํ
return True
# ๋ฟ์๊ฐ ํฐ์ง์ง ์์์ผ๋ฉด False ๋ฐํ
return False
# ๋ฟ์๊ฐ ํฐ์ง ํ ๋ฟ์๊ฐ ์ค๋ ฅ์ ์ํฅ์ ๋ฐ์ ๋ด๋ ค์ค๋ ํจ์
def clear_board(board):
# ํ์์ ์์
ํ๊ธฐ ์ํด ๋ฐฐ์ด์ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ์์ผ์ค๋ค.
rotate_board = list(map(list, zip(*board[::])))[::-1]
for row in rotate_board:
# start: ์ฒ์ ๋ฟ์๊ฐ ๋ฑ์ฅํ๋ ์ธ๋ฑ์ค ์์น (-1๋ก ์ด๊ธฐํ)
start = -1
for i in range(12):
# ์ฒซ ๋ฟ์ ์ธ๋ฑ์ค ์ ์ฅ
if row[i] != '.':
start = i
break
# ํด๋น ํ์ ๋ฟ์๊ฐ ์์ ๊ฒฝ์ฐ
if start != -1:
# ๋น ๊ณต๊ฐ์ ๋นผ์ฃผ๊ณ ์์ ๋น ๊ณต๊ฐ์ ์ฑ์์ค๋ค.
for j in range(start, 12):
if row[j] == '.':
row.pop(j)
row.insert(0, '.')
# ๋ค์ ์๋ ๋ฐฉํฅ์ผ๋ก ๋ ๋ฐฐ์ด(์๊ณ๋ฐฉํฅ 90๋ ํ์ ) ๋ฐํ
return list(map(list, zip(*rotate_board[::-1])))
# ans: ์ฐ์ ํ์
ans = 0
# board: ๋ฟ์๊ฐ ๋์ธ ๋ฐฐ์ด
board = [list(map(str, input())) for _ in range(12)]
while True:
# flag ํด๋น ์ํ์์ ์ฐ์๊ฐ ์์๋์ง ๋ํ๋ด๋ ๋ณ์
flag = False
# visited: ๋ฐฉ๋ฌธ์ฌ๋ถ ํ์ ๋ฐฐ์ด
visited = [[0 for _ in range(6)] for _ in range(12)]
# ๋ฐฐ์ด์ ๋ฟ์๊ฐ ์์ ๊ฒฝ์ฐ ํ์ ์ค์
for r in range(12):
for c in range(6):
if board[r][c] != '.':
# ์ฐ์๊ฐ ์์์ ๊ฒฝ์ฐ flag == True
if bfs(r, c, board[r][c]):
flag = True
# ํด๋น ์ํ์์ ์ฐ์๊ฐ ์์์ ๊ฒฝ์ฐ
if flag:
# ์ฐ์ ํ์๋ฅผ ์ธ์ฃผ๊ณ ๋ฟ์์ ์ํ๋ฅผ ์ ๋ฆฌํด์ฃผ๊ณ ๋ค์ ํ์ฐจ๋ก ๋์ด๊ฐ๋ค.
ans += 1
board = clear_board(board)
# ์ํ์ด ์์์ ๊ฒฝ์ฐ ๊ฒ์์ ์ข
๋ฃํ๋ค.
else:
break
# ์ฐ์ ํ์ ์ถ๋ ฅ
print(ans)
'โญ Problem_Solving > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 5635 ์์ผ (Python/ํ์ด์ฌ) (2) | 2022.12.18 |
---|---|
[๋ฐฑ์ค] 2239 ์ค๋์ฟ (Python/ํ์ด์ฌ) (0) | 2022.11.10 |
[๋ฐฑ์ค] 1253 ์ข๋ค (Python/ํ์ด์ฌ) (1) | 2022.11.08 |
[๋ฐฑ์ค] 1368 ๋ฌผ๋๊ธฐ (Python/ํ์ด์ฌ) (0) | 2022.10.16 |
[๋ฐฑ์ค] 2252 ์ค ์ธ์ฐ๊ธฐ (Python/ํ์ด์ฌ) (0) | 2022.10.15 |
๋๊ธ