๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€

[๋ฐฑ์ค€] 4179 ๋ถˆ! (ํŒŒ์ด์ฌ/python) (with ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ)

by chjcoder 2023. 6. 19.

๐ŸŽˆ๋ฌธ์ œ

https://www.acmicpc.net/problem/4179

 

๐ŸŽ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜?

1. ๋ถˆ์€ ๊ฐ ์ง€์ ์—์„œ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์‚ฐ๋œ๋‹ค -> bfs ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

2. ์ง€ํ›ˆ์ด์™€ ๋ถˆ์€ ๋งค ๋ถ„๋งˆ๋‹ค ํ•œ์นธ์”ฉ ์ˆ˜ํ‰ ๋˜๋Š” ์ˆ˜์ง์œผ๋กœ ์ด๋™ํ•œ๋‹ค. -> bfs ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

3. ๋ถˆ์ด ํƒ€๊ธฐ์ „์— ํƒˆ์ถœํ•˜๋ ค๋ฉด ๋ถˆ์ด ์–ธ์ œ ์–ด๋””๊นŒ์ง€ ํผ์ง€๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋ถˆ์ด ์–ธ์ œ ์–ด๋””๊นŒ์ง€ ํผ์ง€๋Š”์ง€  graph์— ํ‘œ์‹œํ•œ ๋’ค, ์ง€ํ›ˆ์ด์˜ ์ด๋™์‹œ๊ฐ„์„ ๋ฎ์–ด์”Œ์›Œ์ฃผ๋ฉด ๋จ!

4. ๋ถˆ์ด ๋ฒˆ์ง€์ง€ ์•Š์€ ๊ณณ์€ ์—ฌ์ „ํžˆ ํ•ด๋‹น ์ขŒํ‘œ์˜ ๊ฐ’์ด '.' ์ž„์„ ๊ผญ ๊ธฐ์–ตํ•˜๊ณ  ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ!

4. ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ ๊ธ€์€ ๋ฐ‘์— ์žˆ์Œ

 

๐Ÿ’ป์ฝ”๋“œ

from collections import deque

def f_bfs():
    while f_deq:
        x,y = f_deq.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            # graph ๋ฒ—์–ด๋‚œ ์ขŒํ‘œ๋Š” ๋ฌด์‹œ
            if nx < 0 or nx > (r-1) or ny < 0 or ny > (c-1): 
                continue
            '''
            'J'์— ํ•ด๋‹นํ•˜๋Š” ์ขŒํ‘œ๋Š” 0์œผ๋กœ ๋ฏธ๋ฆฌ ๋ฐ”๊ฟ”๋’€๊ธฐ ๋•Œ๋ฌธ์—
            graph[nx][ny] == '.'์ผ ๋•Œ๋งŒ ๋ถˆ์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ.
            '''
            if graph[nx][ny] == '.':
                graph[nx][ny] = graph[x][y] + 1
                f_deq.append([nx,ny])

def j_bfs():
    while j_deq:
        x,y = j_deq.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            # graph๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ํƒˆ์ถœํ–ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
            if nx < 0 or nx > (r-1) or ny < 0 or ny > (c-1):
                time = graph[x][y] + 1
                return print(time)  # ํƒˆ์ถœ!
             #๋ถˆ์ด ๋ฒˆ์ง€์ง€ ์•Š์•˜์œผ๋ฉด ํ•ด๋‹น ์ขŒํ‘œ๊ฐ’์ด '.'์ธ ๊ฒฝ์šฐ๋„ ์žˆ์Œ์„ ๊ณ ๋ ค
            if graph[nx][ny] == '.':
                graph[nx][ny] = graph[x][y] + 1
                j_deq.append([nx,ny])
            # ํ•ด๋‹น ์ขŒํ‘œ๊ฐ’์ด '#'์ด๋ฉด ๋ฐ‘์˜ if๋ฌธ์ด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ ๊ฑธ๋Ÿฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€
            elif graph[nx][ny] != '#':
                if graph[nx][ny] > (graph[x][y] + 1): # ๋ถˆ์˜ ๊ฐ’์ด ์ง€ํ›ˆ์ด๋ณด๋‹ค ํฌ๋ฉด
                    graph[nx][ny] = graph[x][y] + 1
                    j_deq.append([nx,ny])
    time = 'IMPOSSIBLE' # ์ง€ํ›ˆ์ด๊ฐ€ ํƒˆ์ถœํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ด ๋ฌธ์žฅ์— ๋„๋‹ฌ   
    return print(time)

# r: ํ–‰(x), c: ์—ด(y)
r,c = map(int,input().split())

# graph
graph = []
for i in range(r):
    graph.append(list(input()))

#deque
j_deq = deque()
f_deq = deque()
dx = [0,0,-1,1]
dy = [-1,1,0,0]

# ์ง€ํ›ˆ, ๋ถˆ ์ฒ˜์Œ ์œ„์น˜ ํ์— ๋„ฃ๊ธฐ
for i in range(r):
    for j in range(c):
        if graph[i][j] == 'F':
            f_deq.append([i,j])
            graph[i][j] = 0 # 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํ•ด๋‹น ์œ„์น˜ ์‹œ๊ฐ„ ํŒŒ์•…
        if graph[i][j] == 'J':
            j_deq.append([i,j])
            graph[i][j]= 0  # 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํ•ด๋‹น ์œ„์น˜ ์‹œ๊ฐ„ ํŒŒ์•…

f_bfs() # ๋ถˆ ๋จผ์ € bfs๋Œ๋ ค์„œ ์–ธ์ œ ์–ด๋””๊นŒ์ง€ ํผ์ง€๋Š”์ง€ graph์— ํ‘œ๊ธฐ
j_bfs()

์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ ์ˆœ์„œ

 

โ— ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ

์‚ฌ์‹ค ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ฒŒ๋˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ๋“ค์—ˆ๋˜ ์ƒ๊ฐ์ด fire๋ฆฌ์ŠคํŠธ์™€ jihoon๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ด๋™ํ•œ ํ”์ ์„ ์—ฌ๊ธฐ์— ๋‚จ๊ธธ๊นŒ? ์˜€๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ graph์— fire๋ฆฌ์ŠคํŠธ, jihoon๋ฆฌ์ŠคํŠธ๊นŒ์ง€ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜์ž, ๋ฐ”๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ ์˜ค๋ฅ˜๊ฐ€ ๋–ด๊ณ ,, ใ…œใ…œ ๊ทธ๋ž˜์„œ ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ์ง€์ €๋ถ„ํ•˜์ง€๋งŒ graph๋‚ด์— ๋ถˆ๊ณผ ์ง€ํ›ˆ์ด์˜ ์‹œ๊ฐ„์„ ๋ชจ๋‘ ํ‘œ๊ธฐํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋‹ค ๊ฐˆ์•„์—Ž์—ˆ๋‹ค.

 

 

๐Ÿ’ป๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฅ˜ ์ฝ”๋“œ

from collections import deque

def fire_bfs():
    while f_deq:
        x,y = f_deq.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            # graph ๋ฒ—์–ด๋‚œ ์ขŒํ‘œ๋Š” ๋ฌด์‹œ
            if nx < 0 or nx > (r-1) or ny < 0 or ny > (c-1):
                continue
            if graph[nx][ny] == '#' or fire[nx][ny] > 0:
                continue
            if graph[nx][ny] == '.' or graph[nx][ny] == 'J':
                fire[nx][ny] = fire[x][y] + 1
                f_deq.append([nx,ny])

def jihoon_bfs():
    # print('jihoon')
    while j_deq:
        x,y = j_deq.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or nx > (r-1) or ny < 0 or ny > (c-1): # ํƒˆ์ถœ
                time = jihoon[x][y] + 1
                return print(time)
            if graph[nx][ny] == '#' or fire[nx][ny] <= (jihoon[x][y]+1):
                continue
            if graph[nx][ny] == '.' or graph[nx][ny] == 'F':
                jihoon[nx][ny] = jihoon[x][y] + 1
                j_deq.append([nx,ny])
    time = 'IMPOSSIBLE' # ํƒˆ์ถœ ๋ชป ํ•˜๋ฉด ์‹คํ–‰๋จ  
    return print(time)

# r: ํ–‰(x), c: ์—ด(y)
r,c = map(int,input().split())

# graph
graph = []
for i in range(r):
    graph.append(list(input()))
# ๋ถˆ, ์ง€ํ›ˆ ์œ„์น˜ ํ‘œ๊ธฐํ•  ๋ฆฌ์ŠคํŠธ
jihoon = [[0 for j in range(c)] for i in range(r)]
fire = [[0 for j in range(c)] for i in range(r)]
#deque
j_deq = deque()
f_deq = deque()
dx = [0,0,-1,1]
dy = [-1,1,0,0]

# ์ง€ํ›ˆ, ๋ถˆ ์ฒ˜์Œ ์œ„์น˜ ํ์— ๋„ฃ๊ธฐ
for i in range(r):
    for j in range(c):
        if graph[i][j] == 'F':
            f_deq.append([i,j])
        if graph[i][j] == 'J':
            j_deq.append([i,j])

fire_bfs()
jihoon_bfs()