์•Œ๊ณ ๋ฆฌ์ฆ˜/๊ตฌํ˜„

[๋ฐฑ์ค€ 11559 ๐Ÿฅ‡] Puyo Puyo

1eehyunji 2023. 10. 11. 00:51

https://www.acmicpc.net/problem/11559

 

11559๋ฒˆ: Puyo Puyo

์ด 12๊ฐœ์˜ ์ค„์— ํ•„๋“œ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ค„์—๋Š” 6๊ฐœ์˜ ๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ .์€ ๋นˆ๊ณต๊ฐ„์ด๊ณ  .์ด ์•„๋‹Œ๊ฒƒ์€ ๊ฐ๊ฐ์˜ ์ƒ‰๊น”์˜ ๋ฟŒ์š”๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. R์€ ๋นจ๊ฐ•, G๋Š” ์ดˆ๋ก, B๋Š” ํŒŒ๋ž‘, P๋Š” ๋ณด๋ผ, Y๋Š” ๋…ธ๋ž‘์ด๋‹ค.

www.acmicpc.net

๋ฌธ์ œ

๋ฟŒ์š”๋ฟŒ์š”์˜ ๋ฃฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํ•„๋“œ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ƒ‰๊น”์˜ ๋ฟŒ์š”๋ฅผ ๋†“๋Š”๋‹ค. ๋ฟŒ์š”๋Š” ์ค‘๋ ฅ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์•„๋ž˜์— ๋ฐ”๋‹ฅ์ด๋‚˜ ๋‹ค๋ฅธ ๋ฟŒ์š”๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ์•„๋ž˜๋กœ ๋–จ์–ด์ง„๋‹ค.
  • ๋ฟŒ์š”๋ฅผ ๋†“๊ณ  ๋‚œ ํ›„, ๊ฐ™์€ ์ƒ‰ ๋ฟŒ์š”๊ฐ€ 4๊ฐœ ์ด์ƒ ์ƒํ•˜์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด ์—ฐ๊ฒฐ๋œ ๊ฐ™์€ ์ƒ‰ ๋ฟŒ์š”๋“ค์ด ํ•œ๊บผ๋ฒˆ์— ์—†์–ด์ง„๋‹ค. ์ด๋•Œ 1์—ฐ์‡„๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.
  • ๋ฟŒ์š”๋“ค์ด ์—†์–ด์ง€๊ณ  ๋‚˜์„œ ์œ„์— ๋‹ค๋ฅธ ๋ฟŒ์š”๋“ค์ด ์žˆ๋‹ค๋ฉด, ์—ญ์‹œ ์ค‘๋ ฅ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์ฐจ๋ก€๋Œ€๋กœ ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.
  • ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๊ณ  ๋‚˜์„œ ๋‹ค์‹œ ๊ฐ™์€ ์ƒ‰์˜ ๋ฟŒ์š”๋“ค์ด 4๊ฐœ ์ด์ƒ ๋ชจ์ด๊ฒŒ ๋˜๋ฉด ๋˜ ํ„ฐ์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ํ„ฐ์ง„ ํ›„ ๋ฟŒ์š”๋“ค์ด ๋‚ด๋ ค์˜ค๊ณ  ๋‹ค์‹œ ํ„ฐ์ง์„ ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค 1์—ฐ์‡„์”ฉ ๋Š˜์–ด๋‚œ๋‹ค.
  • ํ„ฐ์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฟŒ์š”๊ฐ€ ์—ฌ๋Ÿฌ ๊ทธ๋ฃน์ด ์žˆ๋‹ค๋ฉด ๋™์‹œ์— ํ„ฐ์ ธ์•ผ ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ทธ๋ฃน์ด ํ„ฐ์ง€๋”๋ผ๋„ ํ•œ๋ฒˆ์˜ ์—ฐ์‡„๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

๋‚จ๊ทœ๋Š” ์ตœ๊ทผ ๋ฟŒ์š”๋ฟŒ์š” ๊ฒŒ์ž„์— ํ‘น ๋น ์กŒ๋‹ค. ์ด ๊ฒŒ์ž„์€ 1:1๋กœ ๋ถ™๋Š” ๋Œ€์ „๊ฒŒ์ž„์ด๋ผ ์ž˜ ์Œ“๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ์ƒ๋Œ€๋ฐฉ์ด ํ„ฐ๋œจ๋ฆฐ๋‹ค๋ฉด ์—ฐ์‡„๊ฐ€ ๋ช‡ ๋ฒˆ์ด ๋ ์ง€ ๋ฐ”๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ๋„ ํ•„์š”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์•„์ง ์‹ค๋ ฅ์ด ๋ถ€์กฑํ•˜์—ฌ ๋‚จ๊ทœ๋Š” ์ž๊ธฐ ํ•„๋“œ์—๋งŒ ์‹ ๊ฒฝ ์“ฐ๊ธฐ ๋ฐ”์˜๋‹ค. ์ƒ๋Œ€๋ฐฉ์˜ ํ•„๋“œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์—ฐ์‡„๊ฐ€ ๋ช‡ ๋ฒˆ ์—ฐ์†์œผ๋กœ ์ผ์–ด๋‚ ์ง€ ๊ณ„์‚ฐํ•˜์—ฌ ๋‚จ๊ทœ๋ฅผ ๋„์™€์ฃผ์ž!

์ž…๋ ฅ

์ด 12๊ฐœ์˜ ์ค„์— ํ•„๋“œ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ค„์—๋Š” 6๊ฐœ์˜ ๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค.

์ด๋•Œ .์€ ๋นˆ๊ณต๊ฐ„์ด๊ณ  .์ด ์•„๋‹Œ๊ฒƒ์€ ๊ฐ๊ฐ์˜ ์ƒ‰๊น”์˜ ๋ฟŒ์š”๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

R์€ ๋นจ๊ฐ•, G๋Š” ์ดˆ๋ก, B๋Š” ํŒŒ๋ž‘, P๋Š” ๋ณด๋ผ, Y๋Š” ๋…ธ๋ž‘์ด๋‹ค.

์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ํ•„๋“œ๋Š” ๋ฟŒ์š”๋“ค์ด ์ „๋ถ€ ์•„๋ž˜๋กœ ๋–จ์–ด์ง„ ๋’ค์˜ ์ƒํƒœ์ด๋‹ค. ์ฆ‰, ๋ฟŒ์š” ์•„๋ž˜์— ๋นˆ ์นธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

ํ˜„์žฌ ์ฃผ์–ด์ง„ ์ƒํ™ฉ์—์„œ ๋ช‡์—ฐ์‡„๊ฐ€ ๋˜๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค. ํ•˜๋‚˜๋„ ํ„ฐ์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œ ํ’€์ด

  • ์ฃผ์š”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•์€ BFS์ง€๋งŒ, ๊ตฌํ˜„์ด๋‚˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด๋ผ๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•  ์ •๋„๋กœ ๋”ฐ์งˆ ๊ฒƒ์ด ๋งŽ์€ ๋ฌธ์ œ์˜€๋‹ค!
  • ์šฐ์„ , ๋ฟŒ์š”๋ฟŒ์š”๊ฐ€ ์œ„์—์„œ ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ•„๋“œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋‹จ์ˆœํžˆ pop๊ณผ insert๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์˜ˆ์ œ์˜ ํ•„๋“œ๋Œ€๋กœ 12ํ–‰ 6์—ด๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , 6ํ–‰ 12์—ด๋กœ ์ €์žฅํ–ˆ๋‹ค. (์ฆ‰, ํ•œ ์—ด์”ฉ ํ–‰์œผ๋กœ ์ €์žฅํ–ˆ๋‹ค.)
  • while๋ฌธ์„ ๋Œ๋ฉด์„œ, BFS๋ฅผ ์ด์šฉํ•ด์„œ ํ˜„์žฌ ํ•„๋“œ์—์„œ ์—ฐ์‡„๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„๋“ค์„ ์ฐพ๋Š”๋‹ค. 
    • BFS๋กœ ํƒ์ƒ‰ํ–ˆ์„ ๋•Œ 4๊ฐœ ์ด์ƒ์˜ ๋ฌธ์ž๊ฐ€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ๋ผ๋ฉด visited ๋ฐฐ์—ด์„ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , True๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์ƒํ•˜์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐ๋œ ๋ฌธ์ž๊ฐ€ 4๊ฐœ ๋ฏธ๋งŒ์ด๋ผ๋ฉด ์—ฐ์‡„๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋ฏ€๋กœ, BFS ํƒ์ƒ‰ ๊ณผ์ •์—์„œ 1๋กœ visited ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ์œ„์น˜์˜ ๊ฐ’๋“ค์„ ๋‹ค์‹œ 0์œผ๋กœ ๋ณต๊ตฌํ•˜๊ณ , False๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ํ˜„์žฌ ํ•„๋“œ์—์„œ ์—ฐ์‡„๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„๋“ค์„ ๋ชจ๋‘ visited ๋ฐฐ์—ด์— ํ‘œ์‹œํ•ด๋†จ๋‹ค๋ฉด, isProcessd ๊ฐ’์ด True์ธ ๊ฒฝ์šฐ, ์ฆ‰ BFS๊ฐ€ ์—ฐ์‡„๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์„ ๋ฐœ๊ฒฌํ•ด์„œ True๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๊ฒฝ์šฐ field_update ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ visited๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๊ฐ’์ด 1์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ์œ„์น˜์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•ด์ฃผ๊ณ , ๋งจ ์•ž์— '.'์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฟŒ์š”๋ฟŒ์š”๊ฐ€ ์œ„์—์„œ ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๋Š” ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์—ฐ์‡„์˜ ๊ฐœ์ˆ˜๋ฅผ +1ํ•ด์ค€๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ๋œ ํ•„๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์‹œ for๋ฌธ์„ ๋Œ๋ฉด์„œ ์—ฐ์‡„ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์„ ์ฐพ๊ณ , ์œ„์™€ ๊ฐ™์ด ์—ฐ์‡„ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ๋” ์ด์ƒ ์—ฐ์‡„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์—†๋‹ค๋ฉด for๋ฌธ ํƒ์ƒ‰์„ ๋๋‚ด๊ณ ๋„ isProcessed๊ฐ€ False์ผ ๊ฒƒ์ด๋ฏ€๋กœ, repeat๋ฅผ False๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  while๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค.
import sys
from collections import deque

field=[[] for _ in range(6)]
# 12๊ฐœ์˜ ํ–‰์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•„๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์—ด์„ ๊ธฐ์ค€์œผ๋กœ 6๊ฐœ์˜ ํ–‰์œผ๋กœ ํ•„๋“œ๋ฅผ ๋งŒ๋“ฆ(field ์—…๋ฐ์ดํŠธ๋ฅผ pop์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ)
for _ in range(12):
    line=list(sys.stdin.readline().strip())
    for idx in range(6):
        field[idx].append(line[idx])

def field_update(visited):
    global field
    for i in range(6):
        for j in range(12):
            if visited[i][j]==1:
                field[i].pop(j)
                field[i].insert(0,'.')

def BFS(i,j):
    global visited
    queue=deque()
    queue.append((i,j))
    visited[i][j]=1
    delete_list = []
    delete_list.append((i,j))

    color=field[i][j]
    directions=[(0,1),(1,0),(0,-1),(-1,0)]

    while queue:
        y,x=queue.popleft()
        for di in directions:
            dy=y+di[0]
            dx=x+di[1]
            if 0<=dy<6 and 0<=dx<12 and visited[dy][dx]==0 and field[dy][dx]==color:
                queue.append((dy,dx))
                visited[dy][dx]=1
                delete_list.append((dy,dx))
    if len(delete_list)>=4:
        return True
    else:
        # ์—ฐ์‡„๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด visited ์›์ƒ ๋ณต๊ตฌ
        for y,x in delete_list:
            visited[y][x]=0
        return False

ans=0
repeat=True
while repeat:
    isProcessed = False
    visited = [[0] * 12 for _ in range(6)]
    for i in range(6):
        for j in range(12):
            if field[i][j] != '.' and visited[i][j]==0:
                if BFS(i,j):
                    isProcessed=True
    # ๋ชจ๋“  ์œ„์น˜ ํƒ์ƒ‰ํ•ด๋„ BFS๊ฐ€ True๊ฐ€ ์•ˆ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ
    if isProcessed==False:
        repeat=False
    else:
        # 1 ์—ฐ์‡„๊ฐ€ ๋๋‚˜๋ฉด field update
        field_update(visited)
        ans+=1

print(ans)