[BOJ][๐ก4][๋ฐฑ์ค#004179] ๋ถ!
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์งํ์ด๋ ๋ฏธ๋ก์์ ์ผ์ ํ๋ค. ์งํ์ด๋ฅผ ๋ฏธ๋ก์์ ํ์ถํ๋๋ก ๋์์ฃผ์! ๋ฏธ๋ก์์์ ์งํ์ด์ ์์น์ ๋ถ์ด ๋ถ์ ์์น๋ฅผ ๊ฐ์ํด์ ์งํ์ด๊ฐ ๋ถ์ ํ๊ธฐ์ ์ ํ์ถํ ์ ์๋์ง์ ์ฌ๋ถ, ๊ทธ๋ฆฌ๊ณ ์ผ๋ง๋ ๋นจ๋ฆฌ ํ์ถํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํด์ผํ๋ค. ์งํ์ด์ ๋ถ์ ๋งค ๋ถ๋ง๋ค ํ์นธ์ฉ ์ํ๋๋ ์์ง์ผ๋ก(๋น์ค๋ฌํ๊ฒ ์ด๋ํ์ง ์๋๋ค)ย ์ด๋ํ๋ค.ย ๋ถ์ ๊ฐ ์ง์ ์์ ๋ค ๋ฐฉํฅ์ผ๋ก ํ์ฐ๋๋ค.ย ์งํ์ด๋ ๋ฏธ๋ก์ ๊ฐ์ฅ์๋ฆฌ์ ์ ํ ๊ณต๊ฐ์์ ํ์ถํ ์ ์๋ค.ย ์งํ์ด์ ๋ถ์ ๋ฒฝ์ด ์๋ ๊ณต๊ฐ์ ํต๊ณผํ์ง ๋ชปํ๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ ์ ์ R๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. ๋จ, 1 โค R, C โค 1000 ์ด๋ค. R์ ๋ฏธ๋ก ํ์ ๊ฐ์, C๋ ์ด์ ๊ฐ์์ด๋ค. ๋ค์ ์ ๋ ฅ์ผ๋ก R์ค๋์ ๊ฐ๊ฐ์ ๋ฏธ๋ก ํ์ด ์ฃผ์ด์ง๋ค. ย ๊ฐ๊ฐ์ ๋ฌธ์๋ค์ ๋ค์์ ๋ปํ๋ค.
#: ๋ฒฝ .: ์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ J: ์งํ์ด์ ๋ฏธ๋ก์์์ ์ด๊ธฐ์์น (์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ) F: ๋ถ์ด ๋ ๊ณต๊ฐ
J๋ ์ ๋ ฅ์์ ํ๋๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์งํ์ด๊ฐ ๋ถ์ด ๋๋ฌํ๊ธฐ ์ ์ ๋ฏธ๋ก๋ฅผ ํ์ถ ํ ์ ์๋ ๊ฒฝ์ฐ IMPOSSIBLE ์ ์ถ๋ ฅํ๋ค. ์งํ์ด๊ฐ ๋ฏธ๋ก๋ฅผ ํ์ถํ ์ ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ๋น ๋ฅธ ํ์ถ์๊ฐ์ ์ถ๋ ฅํ๋ค.ย
์์
์ ๋ ฅ
4 4
####
#JF#
#..#
#..#
์ถ๋ ฅ
3
My Sol
import sys
input = sys.stdin.readline
# ์งํ, ๋ถ ์์น ์ฐพ๊ธฐ
def find_JF():
global mat, I, J
for i in range(I):
for j in range(J):
if mat[i][j] == 'F':
F_set.add((i, j))
elif mat[i][j] == 'J':
J_set.add((i, j))
# ์งํ ์ด๋
def move_JH():
global mat, I, J, J_set
tmp = set()
while J_set:
ni, nj = J_set.pop()
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): return True
if mat[si][sj] == '.':
mat[si][sj] = 'J'
tmp.add((si, sj))
J_set = tmp
def move_fire():
global mat, I, J, F_set, J_set
tmp = set()
while F_set:
ni, nj = F_set.pop()
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] == '#': continue
if mat[si][sj] == 'F': continue
mat[si][sj] = 'F'
J_set -= {(si, sj)}
tmp.add((si, sj))
F_set = tmp
I, J = map(int, input().split())
mat = [list(input()) for _ in range(I)]
J_set, F_set = set(), set()
find_JF()
time = 0
impossible = 0
while True:
time += 1
if move_JH(): break
move_fire()
if not J_set:
impossible = 1
break
print('IMPOSSIBLE') if impossible else print(time)
๊ณจ๋4 ์น๊ณ ๋ ๊ฐ๋จํ ๋ฌธ์ ์๋ค.
- ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ค. ์งํ์ด์ ๋ถ์ ์์น๋ฅผ ๊ฐ๊ฐ์ set์ tuple๋ก ๋ด์์ค๋ค.
- ์งํ์ด๊ฐ ๋จผ์ ์ด๋ํ๋ค. set์ ์๋ ์งํ์ด์ ์ขํ์์ ๊ฐ๋ฅํ ๋ชจ๋ ์ํ์ข์ฐ์ ์ด๋์ ํ๋ค. ๋ฒฝ๊ณผ ๋ถ์ชฝ์ ์ด๋ํ์ง ์๊ณ , ๋ง์ฝ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ค๋ฉด ๋ฐ๋ก True๋ฅผ ๋ฐํํ๋ค. ์ด๋ํ ์ ์๋ ๋ชจ๋ ์ขํ๋ tmp์ ๋ฃ์ ๋ค, ๋ชจ๋ ๊ฐ๋ฅํ ์ด๋์ mat์ ํ์ํ๋ค๋ฉด J_set์ tmp๋ฅผ ํ ๋นํ๋ค.
- ์งํ์ด๊ฐ ์ด๋ํ ๋ค, ๋ถ์ด ์ด๋ํ๋๋ฐ, ๋ฒฝ ๋๋ ์ขํ๋ฅผ ๋ฒ์ด๋ ๊ตฌ์ญ๋ง ์๋๋ผ๋ฉด mat์ ๋ชจ๋ F๋ฅผ ํ์ํ๊ณ F_set์ ์ขํ๋ฅผ ์ถ๊ฐํ๋ค. ์ฌ๊ธฐ์ J_set์ ํด๋นํ๋ ์ขํ๊ฐ ์๋ค๋ฉด ๋นผ๋ด์ด์ค๋ค. ์ฆ, ์ด๋ฏธ ์งํ์ด๊ฐ ์ด๋ฒ์ ์ด๋ํ ์ขํ์ ๋ถ์ด ์ฎ๊ฒจ๊ฐ๋ค๋ฉด ์งํ์ด๋ ์ด ์ ์์ผ๋ฏ๋ก ํด๋นํ๋ ์ขํ๋ ๋นผ์ฃผ๋ ๊ฒ์ด๋ค.
- ์ด๋ ๊ฒ ์งํ์ด์ ์ด๋์์ True๊ฐ ๋ฐํ๋ ๋๊น์ง ๋ฐ๋ณตํ๋๋ฐ, ๋ง์ฝ ๋ถ๊ธธ์ด ๊ฑฐ์ธ์ ์งํ์ด๊ฐ ์ด๋ ํ ์ด์๋จ์ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ฉด J_set์ ๋น๊ฒ ๋๋ฏ๋ก False๋ฅผ ํ๋จํ์ฌ impossible ๋ณ์๋ฅผ 1๋ก ์ฒดํฌํ ๋ค while๋ฌธ์ ์ข ๋ฃํ๋ค.
- impossible ๋ณ์์ T/F ์ฌ๋ถ์ ๋ฐ๋ผ time ๋๋ IMPOSSIBLE์ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ