[BOJ][๐ก4][๋ฐฑ์ค#02638] ์น์ฆ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
NรM์ ๋ชจ๋์ข ์ด ์์ ์์ฃผ ์์ ์น์ฆ๊ฐ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ํ์๋์ด ์๋ค. ๋จ, N ์ ์ธ๋ก ๊ฒฉ์์ ์์ด๊ณ , M ์ ๊ฐ๋ก ๊ฒฉ์์ ์์ด๋ค. ์ด ์น์ฆ๋ ๋๋ ๋ณด๊ด์ ํด์ผ๋ง ํ๋๋ฐ ์ค๋ด์จ๋์ ๋ด์ด๋์ผ๋ฉด ๊ณต๊ธฐ์ ์ ์ดํ์ฌ ์ฒ์ฒํ ๋ น๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฌํ ๋ชจ๋์ข ์ด ๋ชจ์์ ์น์ฆ์์ ๊ฐ ์น์ฆ ๊ฒฉ์(์ ์ ์ ์ฌ๊ฐํ ๋ชจ์)์ 4๋ณ ์ค์์ ์ ์ด๋ 2๋ณ ์ด์์ด ์ค๋ด์จ๋์ ๊ณต๊ธฐ์ ์ ์ดํ ๊ฒ์ ์ ํํ ํ์๊ฐ๋ง์ ๋ น์ ์์ด์ ธ ๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์ ์๋ <๊ทธ๋ฆผ 1> ๋ชจ์๊ณผ ๊ฐ์ ์น์ฆ(ํ์์ผ๋ก ํ์๋ ๋ถ๋ถ)๋ผ๋ฉด C๋ก ํ์๋ ๋ชจ๋ ์น์ฆ ๊ฒฉ์๋ ํ ์๊ฐ ํ์ ์ฌ๋ผ์ง๋ค.
<๊ทธ๋ฆผ 1> <๊ทธ๋ฆผ 2>์ ๊ฐ์ด ์น์ฆ ๋ด๋ถ์ ์๋ ๊ณต๊ฐ์ ์น์ฆ ์ธ๋ถ ๊ณต๊ธฐ์ ์ ์ดํ์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค. ๊ทธ๋ฌ๋ฏ ๋ก ์ด ๊ณต๊ฐ์ ์ ์ดํ ์น์ฆ ๊ฒฉ์๋ ๋ น์ง ์๊ณ C๋ก ํ์๋ ์น์ฆ ๊ฒฉ์๋ง ์ฌ๋ผ์ง๋ค. ๊ทธ๋ฌ๋ ํ ์๊ฐ ํ, ์ด ๊ณต๊ฐ์ผ๋ก ์ธ๋ถ๊ณต๊ธฐ๊ฐ ์ ์ ๋๋ฉด <๊ทธ๋ฆผ 3>์์์ ๊ฐ์ด C๋ก ํ์๋ ์น์ฆ ๊ฒฉ์๋ค์ด ์ฌ๋ผ์ง๊ฒ ๋๋ค.
<๊ทธ๋ฆผ 2>
<๊ทธ๋ฆผ 3> ๋ชจ๋์ข ์ด์ ๋งจ ๊ฐ์ฅ์๋ฆฌ์๋ ์น์ฆ๊ฐ ๋์ด์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์น์ฆ๊ฐ ๋ชจ๋ ๋ น์ ์์ด์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ ํํ ์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ๋ชจ๋์ข ์ด์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ ๊ฐ์ ์ ์ N, M (5 โค N, M โค 100)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ N๊ฐ์ ์ค์๋ ๋ชจ๋์ข ์ด ์์ ๊ฒฉ์์ ์น์ฆ๊ฐ ์๋ ๋ถ๋ถ์ 1๋ก ํ์๋๊ณ , ์น์ฆ๊ฐ ์๋ ๋ถ๋ถ์ 0์ผ๋ก ํ์๋๋ค. ๋ํ, ๊ฐ 0๊ณผ 1์ ํ๋์ ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์๋ค.
์ถ๋ ฅ
์ถ๋ ฅ์ผ๋ก๋ ์ฃผ์ด์ง ์น์ฆ๊ฐ ๋ชจ๋ ๋ น์ ์์ด์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ ํํ ์๊ฐ์ ์ ์๋ก ์ฒซ ์ค์ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
8 9
0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0
0 0 0 1 1 0 1 1 0
0 0 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0
0 0 1 1 0 1 1 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
์ถ๋ ฅ
4
My Sol
import sys
input = sys.stdin.readline
from collections import deque
def bfs(ni, nj):
global removeQ, space
Q = deque()
Q.append((ni, nj))
while Q:
ni, nj = Q.popleft()
if visit[ni][nj]: continue
visit[ni][nj] = 1
for di, dj in ((-1,0),(1,0),(0,1),(0,-1)):
si, sj = ni+di, nj+dj
if not (0<=si<I and 0<=sj<J): continue
if mat[si][sj]:
space[si][sj] += 1
if space[si][sj] == 2:
removeQ.append((si, sj))
else:
Q.append((si, sj))
I, J = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(I)]
space = [[0]*J for _ in range(I)]
visit = [[0]*J for _ in range(I)]
removeQ = deque()
bfs(0, 0)
time = 0
while removeQ:
for _ in range(len(removeQ)):
ni, nj = removeQ.popleft()
bfs(ni, nj)
time += 1
print(time)
์์ ์ ํ์๋ ์น์ฆ ๋ฌธ์ ์ ์ผ์ถ ๋น์ทํ ๋๋์ด์๋ค. ๊ฐ์ฅ์๋ฆฌ๋ ํญ์ 0์ผ๋ก ๋น์ด์๊ธฐ ๋๋ฌธ์ (0, 0) ์์น๋ถํฐ bfs๋ฅผ ์ค์ํด, 1์ธ ๊ฐ์ ๋ถ๋ชํ๋ค๋ฉด ํด๋น ์ขํ์ space, ์ฆ ํด๋น ์ขํ์ ์๊ฐ์์ ๊ณต๋ฐฑ์ ํ๋ ์ถ๊ฐํ๋ ๊ฒ์ด๊ณ , ๋ง์ฝ ์ถ๊ฐํจ์ผ๋ก์จ 2๊ฐ ๋๋ค๋ฉด, 2๊ฐ์ ๋ณ์์ ๊ณต๋ฐฑ์ ๋ง์ฃผํ๋ ๊ฒ์ด๋ฏ๋ก ์ ๊ฑฐ๋์์ด๋ค. removeQ์ ์ขํ๋ฅผ ๋ฃ์ด์ค๋ค.
bfs ํจ์ ๋ด๋ถ์์๋ ์ธ์๋ก ์ ๋ฌ๋ ๊ธฐ์ค์ ์ ์์ํ๋ ๋ ๋ฆฝ์ ์ธ bfs์ด๋ฏ๋ก ๋ณ๋์ Q์ 0์ ์ขํ์ด๋ฉด์ visit์ด ์๋์ด์ ์ด๋ํ ์ ์๋ ์ขํ๋ค์ ๋ชจ์๊ฐ๋ฉด์ visit์ ์ฒดํฌํด์ค๋ค.
while๋ฌธ์ removeQ์ ์ ๊ฑฐ๋์์ด ์กด์ฌํ๋๋์ ๊ณ์ ์ค์ํ๋๋ฐ, ์ ๊ฑฐ๋์์ ์ ๊ฑฐํจ๊ณผ ๋์์ bfs๋ฅผ ๋๋ ค์ ํด๋น ์ ๊ฑฐ๋ก ์น์ฆ ๋ด๋ถ์ ๊ณต๊ธฐ์ธต์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ๋๋ฉด, ํด๋น ๊ณต๊ฐ๋ bfs๋ฅผ ๋๋ ค ๋ค์ time์ ์ ๊ฑฐ๋์์ ์ถ๊ฐํด์ฃผ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋ชจ๋ ์ขํ๋ฅผ visitํ์ฌ removeQ๋ฅผ ๋ ์ฑ์ธ ์ ์์ด ์ขํ๊ฐ ์์ด์ง๋ฉด while๋ฌธ์ ์ข ๋ฃ๋๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
์ฒ์์ ๋ด๋ถ ๊ณต๊ธฐ์ธต์ ๊ณ ๋ คํด ํ์ง ์์์ ๊ณ์ ํ๋ ธ๋๋ฐ, ๊ทธ ์ด์ ์ ์์ง ๋ชปํ์๋ค. ์ ๊ฑฐํ ์น์ฆ๋ง๋ค bfs๋ก ํ์ธํ์ฌ ๊ณต๊ธฐ์ธต์ ๊ณ ๋ คํด ์ ๊ฑฐ ๋์์ ํฌํจ์์ผ์ค๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ