๋ฐฑ์ค 4179๋ฒ ๋ฌธ์ ์ธ “๋ถ!” ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ฌธ์ ๋ ๋ฏธ๋ก์์ ๋ถ๊ณผ ์งํ(Jihoon)์ด ์ด๋ํ ์ ์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ก, BFS(๋๋น ์ฐ์ ํ์)๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ณ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ ํ, ์ต์ข
์ ์ธ ์ ๋ต ์ฝ๋๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฌธ์ URL : https://www.acmicpc.net/problem/4179
1. ๋ฌธ์ ์ค๋ช
1) ๋ฌธ์ ๊ฐ์
์ฃผ์ด์ง ๋ฏธ๋ก์์ ๋ถ๊ณผ ์งํ์ ์์น๊ฐ ์ฃผ์ด์ง๋ฉฐ, ์งํ์ด ๋ฏธ๋ก๋ฅผ ํ์ถํ ์ ์๋์ง ์ฌ๋ถ์ ํ์ถํ ์ ์๋ค๋ฉด ๊ทธ ์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์
๋๋ค. ๋ฏธ๋ก๋ ๋ฒฝ('#'), ํต๋ก('.'), ์งํ์ ์ด๊ธฐ ์์น('J'), ๋ถ์ ์ด๊ธฐ ์์น('F')๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
2) ์
๋ ฅ
• ์ฒซ ๋ฒ์งธ ์ค: ๋ฏธ๋ก์ ํ์ ์ R (1 ≤ R ≤ 1000)๊ณผ ์ด์ ์ C (1 ≤ C ≤ 1000)
• ๋ค์ R ๊ฐ์ ์ค: ๋ฏธ๋ก์ ๊ฐ ํ์ ๋ํ ์ ๋ณด
3) ์ถ๋ ฅ
• ์งํ์ด ํ์ถํ ์ ์๋ค๋ฉด ํ์ถํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
• ํ์ถํ ์ ์๋ค๋ฉด "IMPOSSIBLE"์ ์ถ๋ ฅํฉ๋๋ค.
2. ์ ๊ทผ๋ฒ
1) ์ ๋ ฅ๋ฐ๊ธฐ
• sys.stdin.readline์ ์ฌ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ์ ๋ ฅ์ ๋ฐ์ต๋๋ค.
• ๋ฏธ๋ก ์ ๋ณด๋ฅผ 2์ฐจ์ ๋ฆฌ์คํธ๋ก ์ ์ฅํ๊ณ , ์งํ๊ณผ ๋ถ์ ์ด๊ธฐ ์์น๋ฅผ ๋ฐ๋ก ์ ์ฅํฉ๋๋ค.
2) BFS๋ฅผ ํ์ฉํ ํ์
• ๋ถ์ ์ด๋๊ณผ ์งํ์ ์ด๋์ ๊ฐ๊ฐ BFS๋ก ๊ตฌํํฉ๋๋ค.
• ๋ถ์ ํ์ฐ์ ๋ชจ๋ ์ง์ ์์ ๋์์ ์ผ์ด๋๋ฏ๋ก, ๋ถ์ BFS๋ฅผ ๋จผ์ ์ํํ์ฌ ๊ฐ ์์น๊น์ง ๋๋ฌํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
• ์ดํ ์งํ์ BFS๋ฅผ ์ํํ๋ฉด์, ๋ถ์ ๋๋ฌ ์๊ฐ๋ณด๋ค ๋จผ์ ๋๋ฌํ ์ ์๋์ง ๊ฒ์ฌํฉ๋๋ค.
3) ๊ฒฐ๊ณผ ์ถ๋ ฅ
• ์งํ์ด ๋ฏธ๋ก์ ๊ฒฝ๊ณ์ ๋๋ฌํ๋ฉด ํ์ถํ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ ์ด๋ํ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
• ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ ํ์๋ ํ์ถํ ์ ์์ผ๋ฉด "IMPOSSIBLE"์ ์ถ๋ ฅํฉ๋๋ค.
3. ์ ๋ต ์ฝ๋
import sys
input = sys.stdin.readline
# ์
๋ ฅ๋ฐ์ ํ(R)๊ณผ ์ด(C)์ ํฌ๊ธฐ
R, C = map(int, input().split())
arr = []
for _ in range(R):
arr.append(list(input().rstrip())) # ๊ฐ ํ์ ๋ฆฌ์คํธ๋ก ์ ์ฅ
# ์ด๋ ๋ฐฉํฅ์ ๋ํ๋ด๋ ๋ธํ ๋ฐฐ์ด (๋, ์, ๋จ, ๋ถ)
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
# ๋ถ(fire)๊ณผ ์งํ(Jihoon)์ ์ด๋ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก ๋ฐฐ์ด
fDist = [[0] * C for _ in range(R)]
jDist = [[0] * C for _ in range(R)]
# ์งํ๊ณผ ๋ถ์ ์์ ์์น๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
j = []
f = []
# ์งํ๊ณผ ๋ถ์ ์ด๊ธฐ ์์น ์ค์
for r in range(R):
for c in range(C):
if arr[r][c] == 'J': # ์งํ์ ์ด๊ธฐ ์์น
jDist[r][c] = 1 # ์ด๊ธฐ ์์น์์์ ๊ฑฐ๋ฆฌ๋ฅผ 1๋ก ์ค์
j.append((r, c)) # ์งํ์ ์์น ์ถ๊ฐ
if arr[r][c] == 'F': # ๋ถ์ ์ด๊ธฐ ์์น
fDist[r][c] = 1 # ์ด๊ธฐ ์์น์์์ ๊ฑฐ๋ฆฌ๋ฅผ 1๋ก ์ค์
f.append((r, c)) # ๋ถ์ ์์น ์ถ๊ฐ
# ๋ถ์ BFS (๋๋น ์ฐ์ ํ์)
while f:
r, c = f.pop(0)
for i in range(4):
nx = r + dx[i]
ny = c + dy[i]
if 0 <= nx < R and 0 <= ny < C:
if fDist[nx][ny] == 0 and arr[nx][ny] != '#': # ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ
fDist[nx][ny] = fDist[r][c] + 1 # ์ด๋ ๊ฑฐ๋ฆฌ ๊ฐฑ์
f.append((nx, ny)) # ์๋ก์ด ๋ถ ์์น ์ถ๊ฐ
# ์งํ์ BFS (๋๋น ์ฐ์ ํ์)
while j:
r, c = j.pop(0)
for i in range(4):
nx = r + dx[i]
ny = c + dy[i]
if not (0 <= nx < R and 0 <= ny < C): # ์งํ์ด ํ์ถ ๊ฐ๋ฅํ ๊ฒฝ์ฐ
print(jDist[r][c]) # ํ์ฌ๊น์ง์ ์ด๋ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
sys.exit() # ํ๋ก๊ทธ๋จ ์ข
๋ฃ
if 0 <= nx < R and 0 <= ny < C:
if jDist[nx][ny] == 0 and arr[nx][ny] != '#': # ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ
if fDist[nx][ny] > jDist[r][c] + 1 or fDist[nx][ny] == 0:
# ๋ถ๋ณด๋ค ๋จผ์ ๋์ฐฉ ๊ฐ๋ฅ ํน์ ๋ถ์ด ํผ์ง์ง ์๋ ๊ฒฝ์ฐ
jDist[nx][ny] = jDist[r][c] + 1 # ์ด๋ ๊ฑฐ๋ฆฌ ๊ฐฑ์
j.append((nx, ny)) # ์๋ก์ด ์งํ ์์น ์ถ๊ฐ
# ์งํ์ด ํ์ถํ ์ ์๋ ๊ฒฝ์ฐ
print('IMPOSSIBLE')
4. ์ฝ๋ ์ค๋ช
1) ์ ๋ ฅ ๋ฐ๊ธฐ
• R, C๋ ๋ฏธ๋ก์ ํ๊ณผ ์ด์ ์๋ฅผ ์๋ฏธํ๋ฉฐ, arr ๋ฆฌ์คํธ์ ๋ฏธ๋ก์ ๊ฐ ํ์ ์ ์ฅํฉ๋๋ค.
• ๋ฏธ๋ก์ ๊ฐ ์์๋ ๋ฒฝ(#), ํต๋ก(.), ์งํ์ ์์น(J), ๋ถ์ ์์น(F)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
2) ์ด๊ธฐํ
• dx์ dy๋ ๋, ์, ๋จ, ๋ถ ๋ฐฉํฅ์ ๋ํ๋ด๋ ๋ธํ ๋ฐฐ์ด๋ก, BFS ํ์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
• fDist์ jDist๋ ๊ฐ๊ฐ ๋ถ๊ณผ ์งํ์ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ๊ธฐ ์ํ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋ค. ์ด๊ธฐ์๋ ๋ชจ๋ ๊ฑฐ๋ฆฌ๊ฐ 0์ผ๋ก ์ค์ ๋์ด ์์ต๋๋ค.
• j์ f๋ ๊ฐ๊ฐ ์งํ๊ณผ ๋ถ์ ์์ ์์น๋ฅผ ์ ์ฅํ๋ ๋ฆฌ์คํธ์ ๋๋ค.
3) BFS๋ฅผ ์ด์ฉํ ํ์
• ๋ถ์ BFS: ๋ถ์ด ํผ์ง๋ ์๋๋ฅผ ๋จผ์ ๊ณ์ฐํ์ฌ fDist์ ๊ธฐ๋กํฉ๋๋ค. ๋ถ์ด ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ด๋ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํด ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ฉฐ BFS๋ฅผ ์งํํฉ๋๋ค.
• ์งํ์ BFS: ์งํ์ด ํ์ถ ๊ฐ๋ฅํ์ง ํ์ธํ๋ฉฐ, ๋ถ๋ณด๋ค ๋จผ์ ๋์ฐฉํ ์ ์๋์ง ๊ฒ์ฌํฉ๋๋ค. ํ์ถ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํฉ๋๋ค. ๋ง์ฝ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ํด๋ ํ์ถํ์ง ๋ชปํ๋ค๋ฉด "IMPOSSIBLE"์ ์ถ๋ ฅํฉ๋๋ค.
[์์๋]
1. ๋ฏธ๋ก ์ ๋ณด ์ ๋ ฅ ๋ฐ ์ด๊ธฐํ
↓
2. ๋ถ์ BFS ์ํ
↓
3. ์งํ์ BFS ์ํ
↓
4. ํ์ถ ๊ฐ๋ฅํ์ง ํ์ธ
↓
(Yes) ํ์ถ ๊ฐ๋ฅ → ํ์ถ ์๊ฐ ์ถ๋ ฅ
↓
(No) ํ์ถ ๋ถ๊ฐ → "IMPOSSIBLE" ์ถ๋ ฅ
5. Github์ผ๋ก ํ์ธ
'๐ ์๊ณ ๋ฆฌ์ฆ > BOJ(๋ฐฑ์ค)_Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ(๋ฐฑ์ค) 2579[๊ณ๋จ ์ค๋ฅด๊ธฐ] (0) | 2024.08.02 |
---|---|
BOJ(๋ฐฑ์ค) 1463[1๋ก ๋ง๋ค๊ธฐ] (0) | 2024.08.01 |
BOJ(๋ฐฑ์ค) 1753[์ต๋จ๊ฒฝ๋ก] (0) | 2024.07.26 |
BOJ(๋ฐฑ์ค) 11725[ํธ๋ฆฌ์ ๋ถ๋ชจ ์ฐพ๊ธฐ] (0) | 2024.07.25 |
BOJ(๋ฐฑ์ค) 1389[์ผ๋น ๋ฒ ์ด์ปจ์ 6๋จ๊ณ ๋ฒ์น] (0) | 2024.07.23 |