๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 11559 Puyo Puyo (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 11. 10.

<๋ฌธ์ œ ๋งํฌ>

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)

๋Œ“๊ธ€