[BOJ][๐ŸŸก4][๋ฐฑ์ค€#004179] ๋ถˆ!

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #04179


๋ฌธ์ œ

์ง€ํ›ˆ์ด๋Š” ๋ฏธ๋กœ์—์„œ ์ผ์„ ํ•œ๋‹ค. ์ง€ํ›ˆ์ด๋ฅผ ๋ฏธ๋กœ์—์„œ ํƒˆ์ถœํ•˜๋„๋ก ๋„์™€์ฃผ์ž! ๋ฏธ๋กœ์—์„œ์˜ ์ง€ํ›ˆ์ด์˜ ์œ„์น˜์™€ ๋ถˆ์ด ๋ถ™์€ ์œ„์น˜๋ฅผ ๊ฐ์•ˆํ•ด์„œ ์ง€ํ›ˆ์ด๊ฐ€ ๋ถˆ์— ํƒ€๊ธฐ์ „์— ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€, ๊ทธ๋ฆฌ๊ณ  ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผํ•œ๋‹ค. ์ง€ํ›ˆ์ด์™€ ๋ถˆ์€ ๋งค ๋ถ„๋งˆ๋‹ค ํ•œ์นธ์”ฉ ์ˆ˜ํ‰๋˜๋Š” ์ˆ˜์ง์œผ๋กœ(๋น„์Šค๋“ฌํ•˜๊ฒŒ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค)ย  ์ด๋™ํ•œ๋‹ค.ย  ๋ถˆ์€ ๊ฐ ์ง€์ ์—์„œ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์‚ฐ๋œ๋‹ค.ย  ์ง€ํ›ˆ์ด๋Š” ๋ฏธ๋กœ์˜ ๊ฐ€์žฅ์ž๋ฆฌ์— ์ ‘ํ•œ ๊ณต๊ฐ„์—์„œ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.ย  ์ง€ํ›ˆ์ด์™€ ๋ถˆ์€ ๋ฒฝ์ด ์žˆ๋Š” ๊ณต๊ฐ„์€ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ๋‹ค.


์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋‘ ์ •์ˆ˜ 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 ์น˜๊ณ ๋Š” ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์˜€๋‹ค.

  1. ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ง€ํ›ˆ์ด์™€ ๋ถˆ์˜ ์œ„์น˜๋ฅผ ๊ฐ๊ฐ์˜ set์— tuple๋กœ ๋‹ด์•„์ค€๋‹ค.
  2. ์ง€ํ›ˆ์ด๊ฐ€ ๋จผ์ € ์ด๋™ํ•œ๋‹ค. set์— ์žˆ๋Š” ์ง€ํ›ˆ์ด์˜ ์ขŒํ‘œ์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ƒํ•˜์ขŒ์šฐ์˜ ์ด๋™์„ ํ•œ๋‹ค. ๋ฒฝ๊ณผ ๋ถˆ์ชฝ์€ ์ด๋™ํ•˜์ง€ ์•Š๊ณ , ๋งŒ์•ฝ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ๋‹ค๋ฉด ๋ฐ”๋กœ True๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ขŒํ‘œ๋Š” tmp์— ๋„ฃ์€ ๋’ค, ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ด๋™์„ mat์— ํ‘œ์‹œํ–ˆ๋‹ค๋ฉด J_set์— tmp๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
  3. ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ•œ ๋’ค, ๋ถˆ์ด ์ด๋™ํ•˜๋Š”๋ฐ, ๋ฒฝ ๋˜๋Š” ์ขŒํ‘œ๋ฅผ ๋ฒ—์–ด๋‚œ ๊ตฌ์—ญ๋งŒ ์•„๋‹ˆ๋ผ๋ฉด mat์— ๋ชจ๋‘ F๋ฅผ ํ‘œ์‹œํ•˜๊ณ  F_set์— ์ขŒํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ J_set์— ํ•ด๋‹นํ•˜๋Š” ์ขŒํ‘œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋นผ๋‚ด์–ด์ค€๋‹ค. ์ฆ‰, ์ด๋ฏธ ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋ฒˆ์— ์ด๋™ํ•œ ์ขŒํ‘œ์— ๋ถˆ์ด ์˜ฎ๊ฒจ๊ฐ”๋‹ค๋ฉด ์ง€ํ›ˆ์ด๋Š” ์‚ด ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํ•ด๋‹นํ•˜๋Š” ์ขŒํ‘œ๋Š” ๋นผ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
  4. ์ด๋ ‡๊ฒŒ ์ง€ํ›ˆ์ด์˜ ์ด๋™์—์„œ True๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š”๋ฐ, ๋งŒ์•ฝ ๋ถˆ๊ธธ์ด ๊ฑฐ์„ธ์„œ ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ ํ›„ ์‚ด์•„๋‚จ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†๋‹ค๋ฉด J_set์€ ๋น„๊ฒŒ ๋˜๋ฏ€๋กœ False๋ฅผ ํŒ๋‹จํ•˜์—ฌ impossible ๋ณ€์ˆ˜๋ฅผ 1๋กœ ์ฒดํฌํ•œ ๋’ค while๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค.
  5. impossible ๋ณ€์ˆ˜์˜ T/F ์—ฌ๋ถ€์— ๋”ฐ๋ผ time ๋˜๋Š” IMPOSSIBLE์„ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ