๋ฐ๋์ ์ฝ์งํ BFS๋ฌธ์ . ๋ฌธ์ ๊ฐ ์ด๋ ต๊ฒ ๋๊ปด์ง์ง ์์๋๋ฐ ์๊ฐ์ด๊ณผ, ๋ฉ๋ชจ๋ฆฌ์ด๊ณผ ๋ฑ๋ฑ ์ค๋ตํํฐ๊ฐ ๋๋ค.
์์ด๋์ด
- ๋ฌธ์ ์์ ํ์ถ ์กฐ๊ฑด์ด ๊ฐ์ฅ์๋ฆฌ์ ์ ํ ๊ณต๊ฐ์์ ํ์ถํ ์ ์๋ค๊ณ ํ๋ค.
์ด ๋ง์ ์งํ์ด๊ฐ ๊ฐ์ฅ์๋ฆฌ์ ๋์ฐฉ๋ง ํ๋ฉด ์๋์ผ๋ก ํ์ถ ๊ฐ๋ฅํ๋ค.
- ์์๋ ์งํ์ด๊ฐ ํ๋ฒ ์ด๋ํ๊ณ ๋์ ๋ถ์ด ํ์ฐ๋๊ณ 1์ด๊ฐ ์ง๋๋ค.
- ๋ง์ฝ ์งํ์ด๊ฐ ์ด๋ํ ํ ์์น์ ๋ถ์ด ๋ฒ์ง๋ค๋ฉด ๊ทธ๊ณณ์ ๋ชป ๊ฐ๋ ์์น์ด๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์งํ๊ณผ ๋ถ ๊ฐ๊ฐ์ ํ๋ฅผ ๋ง๋ค์ด์ BFS๋ฅผ ํ๋ ๋ฐฉ๋ฒ๊ณผ ์๋๋ฉด ํ ํ๋๋ง ์ฌ์ฉํด์ BFS๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๋๋ ๋ด๊ฐ ์ดํดํ๊ธฐ ์ฌ์ ๋ ์ ์์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ ์ฒด ์ฝ๋
from collections import deque
import sys
input = sys.stdin.readline
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
R, C = map(int, input().rstrip().split())
maze = []
cutTime = 0
fireList = deque()
startPos = deque()
for i in range(R):
maze.append(list(input().rstrip()))
for j in range(C):
if maze[i][j] == 'J':
startPos.append((i, j, 0))
elif maze[i][j] == 'F':
fireList.append((i, j, 0))
while startPos:
cutTime += 1
while startPos and startPos[0][2] < cutTime:
x, y, answer = startPos.popleft()
if (x == 0 or x == R - 1 or y == 0 or y == C - 1) and maze[x][y] == 'J':
print(answer + 1)
exit()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < R and 0 <= ny < C:
if maze[nx][ny] == '.':
maze[nx][ny] = 'J'
startPos.append((nx, ny, answer + 1))
while fireList and fireList[0][2] < cutTime:
x, y, t = fireList.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < R and 0 <= ny < C:
if maze[nx][ny] == '.' or maze[nx][ny] == 'J':
maze[nx][ny] = 'F'
fireList.append((nx, ny, t + 1))
print("IMPOSSIBLE")
์ฝ๋ ์ค๋ช
for i in range(R):
maze.append(list(input().rstrip()))
for j in range(C):
if maze[i][j] == 'J':
startPos.append((i, j, 0))
elif maze[i][j] == 'F':
fireList.append((i, j, 0))
์งํ์ ์ขํ์ ๋ถ์ ์ขํ๋ค์ ์๊ฐ๊ณผ ํจ๊ป ํ์ ๋ฐ๋ก๋ฐ๋ก ๋ฃ์ด ์ค๋ค.
while startPos:
cutTime += 1
while startPos and startPos[0][2] < cutTime:
x, y, answer = startPos.popleft()
if (x == 0 or x == R - 1 or y == 0 or y == C - 1) and maze[x][y] == 'J':
print(answer + 1)
exit()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < R and 0 <= ny < C:
if maze[nx][ny] == '.':
maze[nx][ny] = 'J'
startPos.append((nx, ny, answer + 1))
while fireList and fireList[0][2] < cutTime:
x, y, t = fireList.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < R and 0 <= ny < C:
if maze[nx][ny] == '.' or maze[nx][ny] == 'J':
maze[nx][ny] = 'F'
fireList.append((nx, ny, t + 1))
๊ทธ๋ฆฌ๊ณ ๊ฐ 1์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์ํ๊ฒ๋ ์์ฑํ๋ค.
๋จผ์ ์งํ์ด๋ฅผ ์ด๋์ํจ๋ค. ๋ง์ฝ ์์น๊ฐ ๋ชจํ์ด๋ผ๋ฉด ์ ๋ต์ ์ถ๋ ฅํ๊ณ ์ข
๋ฃํ๋ค.
์๋๋ผ๋ฉด ๋น๊ณณ์ ์ฐพ์ ์ด๋์์ผ ์ฃผ๊ณ ์ขํ์ ์๊ฐ์ ๋ฃ์ด์ค๋ค.
์ฌ๊ธฐ์ while๋ฌธ์ ๋ฌดํ๋ฐ๋ณต ํ์ง ์๋๋ก startPos [0][2] < cutTime ์กฐ๊ฑด์ ์ถ๊ฐํด ์ค๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ค์ ์๊ฐ์ผ๋ก ๋์ด๊ฐ ๊ฒ๋ค์ ๋ฐ๋ณตํ์ง ์๋๋ค.
์งํ์ด๊ฐ ์ด๋์ด ๋๋๋ฉด, ๋ถ์ ํ์ฐ์์ผ ์ค๋ค. ๋ฐฉ๋ฒ์ ์งํ์ด๋ฅผ ์ด๋์ํจ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๋ค.
startPos๊ฐ ๋น ๋๊น์ง 1์ด์ฉ ์ฆ๊ฐ์ํค๋ฉฐ ๋ฐ๋ณตํ๋ค.
startPos๊ฐ ๋น ์ฑ๋ก while๋ฌธ์ด ์ข
๋ฃํ๋ค๋ฉด, ํ์ถ ๋ถ๊ฐ๋ผ๋ ์๋ฏธ์ด๋ฏ๋ก "IMPOSSIBLE"์ ์ถ๋ ฅํด ์ค๋ค.
'๐งฉ Problem Solving > [๋ฐฑ์ค]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2563 ์์ข ์ด (python ํ์ด์ฌ) (0) | 2024.04.01 |
---|---|
[๋ฐฑ์ค] 7579 ์ฑ (python ํ์ด์ฌ) (0) | 2024.03.28 |
[๋ฐฑ์ค] 2212 ์ผ์ (python ํ์ด์ฌ) (0) | 2024.03.27 |
[๋ฐฑ์ค] 16918 ๋ด๋ฒ๋งจ (python ํ์ด์ฌ) (0) | 2024.03.23 |
[๋ฐฑ์ค] 1697 ์จ๋ฐ๊ผญ์ง (python ํ์ด์ฌ) (0) | 2024.03.22 |