[๋ฐฑ์ค€] 4179๋ฒˆ. ๋ถˆ! ๐Ÿ”ฅ

hagnoykmikยท2023๋…„ 10์›” 31์ผ
0

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต

๋ชฉ๋ก ๋ณด๊ธฐ
17/36
post-thumbnail

[๋ฐฑ์ค€] ๋ฒˆ. ๋ถˆ! ๐Ÿ”ฅ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•„์ด๋””์–ด

  • ๋ฐฑ์ค€ ํƒˆ์ถœ์„ ์ƒ๊ฐํ•˜๊ณ  ๋˜‘๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ํž˜๋“ค์—ˆ๋‹ค. (10๋ฒˆ๋งŒ์— ํ†ต๊ณผํ•œ๋“ฏ) -> ์‹ค์ œ ์‹œํ—˜์—์„œ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์—†์ด ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๐Ÿฅบ

์•„์ด๋””์–ด

  1. ์ง€ํ›ˆ์ด์™€ ๋ถˆ์„ ์ˆœ์„œ๋Œ€๋กœ queue์— ๋‹ด๋Š”๋‹ค.
  2. bfs๋ฅผ ํ•œ๋‹ค.
    2-1. ์ง€ํ›ˆ์ด์ผ ๋•Œ ์ด๋™๊ฐ€๋Šฅํ•œ ๊ณณ์„ ์ฐพ๊ณ  ์ด๋™ํ•œ๋‹ค + ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ๊ฒธ ๊ฐ ์ž๋ฆฌ์—์„œ ๋‚˜๊ฐˆ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๋”ํ•ด์ค€๋‹ค(+1)
    2-2. ์ง€ํ›ˆ์ด๊ฐ€ ์žˆ๋Š” ๊ณณ์ด ๋ฒฝ์ด์•„๋‹Œ ๊ฐ€์žฅ์ž๋ฆฌ๋ฉด ํƒˆ์ถœ ๊ฐ€๋Šฅ!
    2-3. ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค์‹œ ์ด๋™ ๋ฐ˜๋ณต.
  3. ๋ถˆ๋„ ๋ฒฝ์ด ์•„๋‹Œ๊ณณ์€ ์ด๋™ํ•œ๋‹ค. -> ์ง€ํ›ˆ์ด๋„ ๋ถˆ๋กœ ๋จน์„ ์ˆ˜(?) ์žˆ์Œ

๋ฌธ์ œ์ 

  1. ๊ฐ€์žฅ์ž๋ฆฌ ๋ฒ”์œ„ ์ž˜๋ชป์„ค์ •
  2. ๋ถˆ์ด ์ด๋™ํ•˜๊ธฐ ์ „์— ๊ฐ€์žฅ์ž๋ฆฌ์— ๋„์ฐฉํ•˜๋ฉด ๊ฐˆ์ˆ˜์žˆ๋‹ค๊ณ  ํ•จ -> ์ผ๋‹จ ๋ถˆ์˜ ์ด๋™๊นŒ์ง€ ๋๋‚ด๊ณ  ๋‚ด์ฐจ๋ก€ ๋•Œ ๊ฐ€์žฅ์ž๋ฆฌ์ธ์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ(๊ฐ€์žฅ์ž๋ฆฌ ๊ฐ€๊ธฐ์ „์— ๋ถˆ์— ๋จนํž ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊นŒ)
  3. ์‹œ์ž‘๋ถ€ํ„ฐ ๊ฐ€์žฅ์ž๋ฆฌ์— ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ํƒˆ์ถœ ๊ฐ€๋Šฅ

์‹œ๊ฐ„ ๋ณต์žก๋„

  • O(r*c)

์ฝ”๋“œ

from collections import deque
import sys
input = sys.stdin.readline

# ํƒˆ์ถœ
def escape(position):
    while position:
        x, y = position.popleft()
        
        # 2. ์ง€ํ›ˆ์ด๋Š” ๋ฏธ๋กœ์˜ ๊ฐ€์žฅ์ž๋ฆฌ์— ์ ‘ํ•œ ๊ณต๊ฐ„ ์‚ด์•„๋‚จ์•„์„œ ๊ฐ”์„ ๋•Œ์—๋งŒ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
        if maze[x][y] == 'J' and not (1 <= x < r - 1 and 1 <= y < c - 1):
            return time[x][y] + 1
        
        # ์ด๋™
        for d in range(4):
            nx = x + dx[d]
            ny = y + dy[d]

            # ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ฉด ์ด๋™
            if 0 <= nx < r and 0 <= ny < c and maze[nx][ny] != '#':
                # ์ง€ํ›ˆ์ด๊ฐ€ ์•ˆ๊ฐ”๋˜ ๊ณณ์ด๋ฉด
                if maze[x][y] == 'J' and maze[nx][ny] == '.' and maze[nx][ny] != 'J': 
                    time[nx][ny] = time[x][y] + 1 # ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„

                    
                    position.append((nx, ny))    
                    maze[nx][ny] = 'J'            # ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
                
                # ๋ถˆ!์ด๊ณ  ์•ˆ๊ฐ”๋˜ ๊ณณ์ด๋ฉด
                if maze[x][y] == 'F' and maze[nx][ny] != 'F':
                    position.append((nx, ny))
                    maze[nx][ny] = 'F'

    return "IMPOSSIBLE"


r, c = map(int, input().split())
maze = [list(input().strip()) for _ in range(r)]
time = [[0] * c for _ in range(r)]
position = deque([])
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]


# ์ง€ํ›ˆ์ด์˜ ์œ„์น˜์™€ ๋ถˆ์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค.
for i in range(r):
    for j in range(c):
        # ์ง€ํ›ˆ์ด ๋จผ์ € ๋„ฃ๊ธฐ
        if maze[i][j] == 'J':
            # 3. ๋ฐ”๋กœ ํƒˆ์ถœ ๊ฐ€๋Šฅํ•˜๋ฉด ํƒˆ์ถœํ•˜๊ธฐ
            if not (1 <= i < r - 1 and 1 <= j < c - 1):
                print(1)
                exit(0)
            position.appendleft((i, j))
        elif maze[i][j] == 'F':
            position.append((i, j))

# ํƒˆ์ถœํ•˜๋Ÿฌ๊ฐ€๊ธฐ
print(escape(position))
profile
์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž, ๊น€๊ฒฝ์•„์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€