[BOJ][๐ก2][๋ฐฑ์ค#10711] ๋ชจ๋์ฑ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold II
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๋ช ์ฐ์ ์น๊ตฌ๋ค์ ์ฌ๋ฆ๋ฐฉํ์ ๋ง์ดํ์ฌ ํด๋ณ๊ฐ์ ๋๋ฌ๊ฐ๊ธฐ๋ก ํ๋ค. ์ด๋ฒ์ ์ฌํ์ ๋ ๋ ํด์์์ฅ์ ์ด๋ฆ์ ALPS(Awsome Land & Poor Sea)์ด๋ค. ํด๋ณ๊ฐ์์ ์์๋ณต์ ์ ์ ๋ฏธ๋ ๋ค์๊ฒ ๊ด์ฌ์ด ๋ง์ ์์ฒ ์ด์๋ ๋ฌ๋ฆฌ ๋ช ์ฐ๋ ํด๋ณ๊ฐ์ ๋ชจ๋์ ๋ ๊ด์ฌ์ด ๋ง๋ค. ํด๋ณ๊ฐ์ ๋ชจ๋๋ ๋ฌดํํ ๊ฒ๋ค์ ๋ง๋ค ์ ์๋ ๊ฐ๋ฅ์ฑ์ ๋ดํฌํ๊ณ ์๋ค. ๋ํ ์ด๋ ๊ฒ ๋ง๋ค์ด์ง ์ํ์ด ํ๋์ ์ํด ์ฌ๋ผ์ง๋ ๋ชจ์ต์, ๋ง์น ์์ ์ด ๊ฐ์ฅ ๋น๋ ์ ์๋ ์๊ฐ์ ์๊ณ ์ค์ค๋ก ์๋ฆ๋ต๊ฒ ์ฐํํ๋ ค๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ์ด๋ฐ ์๋ฒฝ์ ๊ฐ๊น์ด ๋ฌผํ์ธ ๋ชจ๋๋ฅผ ๋๊ณ ์ ํด์์์ด๋ ํค์์ ์น๋ ๊ฒ์ ์ธ์์ ๋ญ๋นํ๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค. ํ์ง๋ง ์๋ฌด๋ ๋ช ์ฐ์ ๋ง์ ๊ณต๊ฐํด์ฃผ์ง ๋ชปํ๊ณ , ๊ฒฐ๊ตญ ๋ช ์ฐ๋ ํผ์์ ๋ชจ๋์ฑ์ ๋ง๋ค์๋ค. ๋ค๋ฅธ ์น๊ตฌ๋ค์ด ํผ์ ์ ํ์ ๋คํด ๋๊ณ ์์ ๋ ๋ช ์ฐ๋ ํผ์ ์ ํ์ ๋คํด ๋ชจ๋์ฑ์ ์์๋ค. ์ด ๋ชจ๋์ฑ์ ์ธ์ ๊ฐ ํ๋์ ์ํด์ ๋ฌด๋์ง ํฐโฆ ๋ช ์ฐ๋ ์ด๋ฐ ๋ฌด๋์ง๋ ์์ ์ ์ผํ์ผ๋ก ์ดํดํ ์ฌ๋์ด๋ฏ๋ก ๋ฌด๋์ง๋ ๊ฒ๋ ๊ณ ๋ คํด์ ๋ชจ๋์ฑ์ ๋ง๋ค์๋ค. ๊ทธ๊ฐ ๋ง๋ ๋ชจ๋์ฑ์ 2์ฐจ์ ๊ฒฉ์๋จ์๋ก ๋ง๋ค์์ผ๋ฉฐ, ๊ฐ ๊ฒฉ์๋ง๋ค ํผํผํจ์ ์ ๋๋ฅผ ๋ค๋ฅด๊ฒ ํด์ ์ฑ์ ๋ง๋ค์๋ค. ์ด ํผํผํจ์ 1๋ถํฐ 9 ์ฌ์ด์ ์ซ์๋ก ํํ๋ ์ ์๋ค. ์ด ํผํผํจ์, ์๊ธฐ ๊ฒฉ์ ์ฃผ๋ณ์ 8๋ฐฉํฅ (์ ์๋ ์ผ์ชฝ ์ค๋ฅธ์ชฝ, ๊ทธ๋ฆฌ๊ณ ๋๊ฐ์ ) ์ ๋ด์ ๋ชจ๋์ฑ์ด ์์ฌ์์ง ์์ ๋ถ๋ถ์ ๊ฐ์๊ฐ ์๊ธฐ ๋ชจ๋์ฑ์ ํผํผํจ๋ณด๋ค ๋ง๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ ํ๋์ ์ํด์ ๋ฌด๋์ง ์ ์์์ ์๋ฏธํ๋ค. ๊ทธ ์ด์ธ์ ๊ฒฝ์ฐ๋ ํ๋๊ฐ ์ณ๋ ๋ฌด๋์ง์ง ์๋๋ค. ๋ชจ๋์ฑ์ด ๋ฌด๋์ง ๊ฒฝ์ฐ, ๊ทธ ๊ฒฉ์๋ ๋ชจ๋์ฑ์ด ์์ฌ์์ง ์์ ๊ฒ์ผ๋ก ์ทจ๊ธํ๋ค. ์ด ๋ชจ๋์ฑ์ ์ธ์ ๊ฐ๋ ํ๋์ ์ํด์ ๊น์ด๊ณ ๊น์ฌ์, ๊ฒฐ๊ตญ ํ๊ฐ์ง ํํ๋ก ์๋ ดํ ๊ฒ์ด๋ค. ๋ชจ๋์ฑ์ ์์ฑํ ๋ช ์ฐ๋ ๋ฌธ๋ ์์ ์ด ๋ง๋ ์์ ํ์ ์๋ช ์ด ๊ถ๊ธํด์ก๋ค. ๋ชจ๋์ฑ์ ์์ ์์ ํ ๋ฐ์ ๊ฐ์ด ํ๋๊ฐ ํ๋ฒ ์น ๋๋ง๋ค ํน์ ๋ถ๋ถ์ด ๋ฌด๋์ ๋ด๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ๋ชจ์์ด ๋ณํ๋๋ค. ๋ชจ๋์ฑ์ด ๋์ด์ ๋ชจ์์ด ๋ณํ์ง ์๊ฒ ๋๋ ค๋ฉด (๋ชจ์์ด ์๋ ด๋๋ ค๋ฉด) ํ๋๊ฐ ๋ช๋ฒ ์ณ์ผํ๋์ง ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ๋ชจ๋์ฑ์ ๊ฐ๋ก์ธ๋ก ๊ฒฉ์ ํฌ๊ธฐ H, W๊ฐ ์ฃผ์ด์ง๋ค. (1 โค H, W โค 1,000) ๊ทธ ๋ค์ H์ค์ ๊ฑธ์ณ W๊ฐ์ ๋ฌธ์๋ก ๋ชจ๋์ฑ์ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ฌธ์๊ฐ ๋ค์ด์จ๋ค. ๊ฐ ๋ฌธ์๋ 1~9 ์ฌ์ด์ ์ซ์, ๋๋ โ.โ ์ด๋ค. 1~9๋ ๊ทธ ๊ฒฉ์์ ๋ชจ๋์ ๊ฐ๋๋ฅผ ๋ํ๋ด๋ฉฐ, โ.โ๋ ๋ชจ๋๊ฐ ์๋ค๋ ๋ป์ด๋ค. ๋ชจ๋์ฑ์ ๊ฒฉ์์ ๊ฐ์ฅ์๋ฆฌ์ ์ ํด ์์ง ์๋ค.
์ถ๋ ฅ
๋ช๋ฒ์ ํ๋๊ฐ ๋ชฐ๋ ค์ค๊ณ ๋์์ผ ๋ชจ๋์ฑ์ ์ํ๊ฐ ์๋ ดํ๋์ง๋ฅผ ๊ตฌํ๋ค.
์์
์์ 1
์ ๋ ฅ
5 6
......
.939..
.3428.
.9393.
......
์ถ๋ ฅ
3
์์ 2
์ ๋ ฅ
10 10
..........
.99999999.
.9.323239.
.91444449.
.91444449.
.91444449.
.91444449.
.91232329.
.99999999.
..........
์ถ๋ ฅ
35
My Sol
I, J = map(int, input().split())
mat = [list(map(lambda x: (x if x=='.' else int(x)), input())) for _ in range(I)]
cass = [[[0xfff, 0] for _ in range(J)] for _ in range(I)]
# ์ต์ด ๋์ด ๊ณ์ฐ
Q = set()
ql = 0
for i in range(I):
for j in range(J):
if mat[i][j]!='.':
cass[i][j][0] = int(mat[i][j])
Q.add((i, j))
ql += 1
# ๋ชจ๋ ๋ชจ๋๋ผ๋ฉด 0 ์ถ๋ ฅ
if not Q:
print(0)
quit()
# ์ต์ด removeSet ํ์ธ
removeSet = set()
while Q:
ni, nj = Q.pop()
cnt = 0
for di in range(-1, 2):
for dj in range(-1, 2):
si, sj = ni+di, nj+dj
if mat[si][sj]=='.':
cnt += 1
cass[ni][nj][1] = cnt
if cnt >= cass[ni][nj][0]:
removeSet.add((ni, nj))
wave = 0
while removeSet:
removeSet2 = removeSet
removeSet = set()
while removeSet2:
ni, nj = removeSet2.pop()
mat[ni][nj] = '.'
for di in range(-1, 2):
for dj in range(-1, 2):
si, sj = ni+di, nj+dj
if mat[si][sj]=='.': continue
cass[si][sj][1] += 1
if cass[si][sj][0] == cass[si][sj][1]:
removeSet.add((si, sj))
wave += 1
print(wave)
BFS๋ฅผ ๊ทนํ์ผ๋ก ์ฌ์ฉํ๋ ๋ฌธ์ ์๋ค. ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ์ผ๋ถ ์๋๋ฐ, ๊ฒฝ์ฐ๋ฅผ ๋๋๊ธฐ ์ํด์ ๋ถ๊ฐํผํ๋ค. ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ํฌ๊ธฐ ๋๋ฌธ์ ์ ์ด ์๋ ์ซ์๊ฐ ์๋ ์ขํ์ ๋ํด ํด๋น ์ขํ์ ๊ฐ๊ณผ, ์ฃผ๋ณ์ ์ ์ ๊ฐ์๋ฅผ ์ธ์๊ณ , ์ด ์ฃผ๋ณ์ ์ ์ ๊ฐ์๊ฐ ์ฒ์์ ์ขํ์ ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ๋ค์ ํ๋์์ ์ ๊ฑฐ ๋์์ด๋ฏ๋ก removeSet์ ์ขํ๋ฅผ ๋ฃ์ด์ค๋ค. ๋ง์ฝ ์ฒ์์ ๋ชจ๋ ์ขํ์ ๋ํด ํ์ํ๋๋ฐ, ๊ฐ์ด ๋ชจ๋ ., ์ฆ ๋ชจ๋์ฑ์ด ์๋ค๋ฉด 0์ ์ถ๋ ฅํ๋๋ก ์ด๊ธฐ ์ค์ ํ์๊ณ , ๋ชจ๋์ฑ์ด ์๋๋ผ๋ ๋ณํ์ง ์๋๋ค๋ฉด removeSet์ด ๋น set์ด ๋๋ฏ๋ก while์ ํต๊ณผํ์ง ์๊ณ ๋ฐ๋ก wave 0์ ์ถ๋ ฅํ๊ฒ ๋๋ค.
while ๋ฌธ์ ๋ฐ๋ณต์, ์ด์ ํ๋์์ ์ด๋ป๊ฒ๋ ๋ถ์์ง๋ ๋ชจ๋์ฑ์ด ์๋ ๊ฒฝ์ฐ ์คํ๋๋๋ฐ, ํด๋น ์ ๊ฑฐ ๋์์ ์ขํ๋ฅผ .์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ํ๋ฐฉ์ ํ์ ์ขํ์ ๋ํด ํ์ ์ขํ๊ฐ .์ด๋ผ๋ฉด continueํ๋ค. ๋ง์ฝ ์ ๊ฑฐ ๋์์ ์ฃผ๋ณ ํ๋ฐฉ์ ๋ชจ๋์ฑ์ด ์๋ค๋ฉด, ํด๋น ๋ชจ๋์ฑ์๊ฒ๋ ์ฃผ๋ณ์ ๋ชจ๋์ฑ์ด ํ๋ ์ ๊ฑฐ๋๋ ๊ฒ์ด๋ฏ๋ก, ์ด๋ฅผ ๊ฐ์ 1 ์ถ๊ฐํด์ค๋ค. ์๊ฐํด๋ณด๋ ๊ฐ์ ํ๋์ฉ ์ค์ฌ๊ฐ๋ฉด ์ด๋ ์๊น ์ถ๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ญ๋นํ๊ฒ ๋์์ง๋ง ์ด์จ๋ ๊ธฐ๋ฅ์ ํ๋ค.
๊ทธ๋์ ๋ฐ๋ณต ๋ด์ cass๋ ์ฑ์ ๊ฒฌ๊ณ ํจ์ด ํญ์ ์ฃผ๋ณ์ ๋ชจ๋ ๊ฐ์๋ณด๋ค ๋ง์๋ฐ, ์ ๊ฑฐ ๋์์ ๋ชจ๋์ฑ์ด ์ญ์ ๋๋ฉด์ ๋ชจ๋์์ด ๋์ด์ ์ฑ์ ๊ฒฌ๊ณ ํจ๊ณผ ๊ฐ๊ฒ ๋๋ค๋ฉด, ํด๋น ํ์์ขํ๋ฅผ removeSet์ ์ถ๊ฐํ๊ณ ๋ค์ wave ๋ ์ ๊ฑฐํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค. ์ด๋ ๊ฒ removeSet์ด ์ฑ์์ง์ง ์๋, ์ฆ wave์๋ ์ ๊ฑฐ ๋์์ด ์๋ค๋ฉด wave๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
import sys
from collections import deque
input = sys.stdin.readline
dydx = [(-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1)]
H, W = map(int, input().split())
board = []
q = deque()
for i in range(H):
board.append(list(input().rstrip()))
for j in range(W):
if board[i][j] == ".":
q.append((0, i, j))
board[i][j] = 0
else:
board[i][j] = int(board[i][j])
while q:
t, y, x = q.popleft()
for dy, dx in dydx:
ny, nx = y+dy, x+dx
if 0 <= ny < H and 0 <= nx < W:
board[ny][nx] -= 1
if board[ny][nx] == 0:
q.append((t+1, ny, nx))
print(t)
์ฑ์ ํํฉ์์ ์๊ฐ์ ์ผ๋ก๋, ๋ฉ๋ชจ๋ฆฌ์ ์ผ๋ก ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์ฐพ์ ๋ถ์ํ๋ค. set ๋์ q๋ฅผ ์ฌ์ฉํ๋ค. ์ค๋ณต ์ขํ๊ฐ ์๊ธฐ ๋๋ฌธ์ deque์ธ q๋ฅผ ์ฌ์ฉํด๋ ๊ด์ฐฎ์ ๊ฒ์ด๋ค. ์์์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํ๋ฉด์ ๋๊ผ๋ ๊ฐ์ ๋ด๋ฆฌ๋ ๊ฑด ์ด๋จ๊น ์ถ์๋๋ฐ, ๋ฑ ๊ทธ ์ฝ๋๋ฅผ ์์ฑํ์๋ค. ๊ทธ๋ฆฌ๊ณ sys.stdin.readline์ ๋๋ ์ฌ์ฉํ๋ค๊ฐ ValueError ๋ฐ์์ผ๋ก ์ง์์ฃผ์๋๋ฐ, ์ด ๋ถ์ ์ฌ์ฉ์ด ๋๋๋ณด๋ค. ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ํฌ๋ฏ๋ก, ์ด ์ญ์ ์ํฅ์ ์ฃผ์์ ๊ฒ์ด๋ค.
๋๋ wave๋ก ์์ ์นด์ดํธ๋ฅผ ํ๋๋ฐ, ์ด ๋ถ์ ์ขํ์ ๋ํด์ ์นด์ดํธ๋ฅผ t์ ๋ฃ์ด์ฃผ์๋ค. ์ด๋ ๊ฒ ๋ชจ๋ q์ ์์์ ๋ํด t๊ฐ ๋งค๋ฒ ๊ฐฑ์ ๋๋ค๊ฐ q๊ฐ ๋ฐ๋ฅ๋๋ฉด ๋ง์ง๋ง q ์์์ t๊ฐ ์ต๋๋ก ํ๋๊ฐ ์น ํ์์ด๋ฏ๋ก, ์ด๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค. ์๋นํ ์ ์ง ์ฝ๋์ธ ๊ฒ ๊ฐ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ