๐ฅ ๋ถ!
๋ฐฑ์ค Gold4
๋ฌธ์
์งํ์ด๋ ๋ฏธ๋ก์์ ์ผ์ ํ๋ค. ์งํ์ด๋ฅผ ๋ฏธ๋ก์์ ํ์ถํ๋๋ก ๋์์ฃผ์!
๋ฏธ๋ก์์์ ์งํ์ด์ ์์น์ ๋ถ์ด ๋ถ์ ์์น๋ฅผ ๊ฐ์ํด์ ์งํ์ด๊ฐ ๋ถ์ ํ๊ธฐ์ ์ ํ์ถํ ์ ์๋์ง์ ์ฌ๋ถ, ๊ทธ๋ฆฌ๊ณ ์ผ๋ง๋ ๋นจ๋ฆฌ ํ์ถํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํด์ผํ๋ค.
์งํ์ด์ ๋ถ์ ๋งค ๋ถ๋ง๋ค ํ์นธ์ฉ ์ํ๋๋ ์์ง์ผ๋ก(๋น์ค๋ฌํ๊ฒ ์ด๋ํ์ง ์๋๋ค) ์ด๋ํ๋ค.
๋ถ์ ๊ฐ ์ง์ ์์ ๋ค ๋ฐฉํฅ์ผ๋ก ํ์ฐ๋๋ค.
์งํ์ด๋ ๋ฏธ๋ก์ ๊ฐ์ฅ์๋ฆฌ์ ์ ํ ๊ณต๊ฐ์์ ํ์ถํ ์ ์๋ค.
์งํ์ด์ ๋ถ์ ๋ฒฝ์ด ์๋ ๊ณต๊ฐ์ ํต๊ณผํ์ง ๋ชปํ๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ ์ ์ R๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. ๋จ, 1 โค R, C โค 1000 ์ด๋ค. R์ ๋ฏธ๋ก ํ์ ๊ฐ์, C๋ ์ด์ ๊ฐ์์ด๋ค.
๋ค์ ์ ๋ ฅ์ผ๋ก R์ค๋์ ๊ฐ๊ฐ์ ๋ฏธ๋ก ํ์ด ์ฃผ์ด์ง๋ค.
๊ฐ๊ฐ์ ๋ฌธ์๋ค์ ๋ค์์ ๋ปํ๋ค.
- #: ๋ฒฝ
- .: ์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ
- J: ์งํ์ด์ ๋ฏธ๋ก์์์ ์ด๊ธฐ์์น (์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ)
- F: ๋ถ์ด ๋ ๊ณต๊ฐ J๋ ์ ๋ ฅ์์ ํ๋๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์งํ์ด๊ฐ ๋ถ์ด ๋๋ฌํ๊ธฐ ์ ์ ๋ฏธ๋ก๋ฅผ ํ์ถ ํ ์ ์๋ ๊ฒฝ์ฐ IMPOSSIBLE ์ ์ถ๋ ฅํ๋ค.
์งํ์ด๊ฐ ๋ฏธ๋ก๋ฅผ ํ์ถํ ์ ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ๋น ๋ฅธ ํ์ถ์๊ฐ์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
4 4
####
#JF#
#..#
#..#
์์ ์ถ๋ ฅ 1
3
๐ ์๊ณ ๋ฆฌ์ฆ
๋ฌธ์ ์์ ๋ฌป๊ณ ์ ํ๋ ๊ฒ์ ๋ฏธ๋ก์์ ์งํ์ด๊ฐ ๊ฐ์ฅ์๋ฆฌ๋ก ์ผ๋ง๋ ๋นจ๋ฆฌ ๋๋ฌํ ์ ์๋์ง์ด๋ค.
๋ค์ ๋งํด, Weight๊ฐ ์๋ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๊ณ [ํน์ ๋ ธ๋์์ ํน์ ๋ ธ๋์ ์ต๋จ๊ฑฐ๋ฆฌ] ๋ฌธ์ ๋ก ์นํํ ์ ์๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ฝ๊ฒ BFS๋ฅผ ๋ ์ฌ๋ฆด ์ ์๋ค. ๋ค๋ง, ์ฃผ์ํ ์ ์ ์งํ์ด ๋ฟ๋ง ์๋๋ผ ๋ถ์ ์ด๋๋ ๋์์ ๊ณ ๋ คํด์ฃผ์ด์ผ ํ๋ค๋ ์ ์ด๋ค.
๐ ์ค๊ณ
TRY 1, ์๊ฐ ์ด๊ณผ
์งํ์ด์ ๋ถ๋ก๋ถํฐ BFS๋ฅผ ์ถ๋ฐํ์ฌ ์๊ฐ์ ์ฆ๊ฐ์์ผ์ค๋ค. ๊ทธ๋ ๊ฒ ๋ชจ๋ BFS ํ์์ ๋๋ง์น๊ณ ๊ฐ์ฅ์๋ฆฌ์ ์์นํ๋ฉฐ ๋ฒฝ๊ณผ ๋ถ์ ์ ์ธํ ์๊ฐ๋ค ์ค์์ ์ ์ผ ์์ ์ซ์๋ฅผ ๋ฝ์์ ์ถ๋ ฅํ๋ค. ์ด ๋, ํ์ถํ๊ธฐ ์ํ ๋ง์ง๋ง 1๋ถ๋ ํฌํจ๋์ด ์์ผ๋ +1๋ถ์ ํด์ค๋ค.
TRY 2, ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ
1ํธ์์๋ BFS ํ์ ์ ๋ถ ๋๋ง์น๊ณ ์๊ฐ์ ์ฐพ์๋๋ฐ 2ํธ์์๋ while๋ฌธ ์ค๊ฐ์ ์งํ์ด๊ฐ ๊ฐ์ฅ์๋ฆฌ์ ๋๋ฌํ์ ๊ฒฝ์ฐ ๋ฐ๋ก ํ์ถํ ์ ์๋๋ก ์์ ํ์๋ค.
# ์งํ์ด ํ์ถ ์กฐ๊ฑด
if (x == 0 or x == R-1 or y == 0 or y == C-1) and who == 'J':
return count[x][y] + 1
TRY 3, ์ ๋ต
์๋ฃจ์ ์ฐธ๊ณ : https://velog.io/@hygge/Python-๋ฐฑ์ค-4179-๋ถ-BFS
๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋์ ์ต๋ํ ๋ณ์ ์ฌ์ฉ์ ์ค์๋ค. ์๋๋ 2ํธ์์ ์ญ์ ํ ๋ณ์๋ค์ด๋ค.
๋๋ฆ ์ค์ธ๋ค๊ณ ์ค์๋๋ฐ ๋ ์ด์ ๋ญ ๋ ์ค์ฌ์ผํ ์ง ๋ชฐ๋ผ์ ์๋ฃจ์ ์ ์ฐธ๊ณ ํ์๋ค. ๐ก
- ๋ฐฉ๋ฌธ ์ฌ๋ถ visited ๋ฐฐ์ด
- ๋ถ๊ณผ ์งํ์ด๋ฅผ ํ๋ณํ๋ who
- ์๊ฐ์ ๊ธฐ๋กํ๋ time ๋ฐฐ์ด
- ๋ถ์ ์์น๋ฅผ ๋ด๋ fire ๋ฐฐ์ด
์ต๋ํ Queue ํ๋๋ก ์ ๋ถ ํด๊ฒฐํ ์ ์๋๋ก ํ์๋ค.
๐จ๐ปโ๐ป CODE
TRY 1
import sys
input = sys.stdin.readline
from collections import deque
R,C = map(int,input().split())
maze = [] # ๊ทธ๋ํ
dx = [1,-1,0,0]
dy = [0,0,1,-1]
fire = [] # ๋ถ ์์น
edge = [] # ๊ฐ์ฅ์๋ฆฌ
for i in range(R):
maze.append(list(input().rstrip()))
# ์งํ,๋ถ ์์น ์ฐพ๊ธฐ
for i in range(R):
for j in range(C):
if maze[i][j] == 'J':
j_x,j_y = (i,j)
if maze[i][j] == 'F':
fire.append((i,j))
# ์ต๋จ ๊ฑฐ๋ฆฌ ์ฐพ๊ธฐ
def bfs(a,b):
q = deque([])
q.append([(a,b),'J'])
for i in range(len(fire)):
q.append([(fire[i][0],fire[i][1]),'F'])
visited = [[False]*C for _ in range(R)]
count = [[0]*C for _ in range(R)]
while q:
temp = q.popleft()
x,y = temp[0]
who = temp[1]
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<R and 0<=ny<C and visited[nx][ny] == False and (nx,ny) not in fire:
if maze[nx][ny] == '.':
if who == 'J':
q.append([(nx,ny),'J'])
visited[nx][ny] = True
count[nx][ny] = count[x][y] + 1
if who == 'F':
q.append([(nx,ny),'F'])
fire.append((nx,ny))
return count
distance = bfs(j_x,j_y)
answer = []
# ๊ฐ์ฅ์๋ฆฌ ์ต๋จ๊ฑฐ๋ฆฌ
for i in range(R):
if i == 0 or i == R-1:
for j in range(C):
if distance[i][j] > 0:
answer.append(distance[i][j])
else:
if distance[i][0] > 0:
answer.append(distance[i][0])
if distance[i][C-1] > 0:
answer.append(distance[i][C-1])
if not answer:
print("IMPOSSIBLE")
else:
print(min(answer)+1)
TRY 2
import sys
input = sys.stdin.readline
from collections import deque
R,C = map(int,input().split())
maze = [] # ๊ทธ๋ํ
dx = [1,-1,0,0]
dy = [0,0,1,-1]
fire = [] # ๋ถ ์์น
edge = [] # ๊ฐ์ฅ์๋ฆฌ
for i in range(R):
maze.append(list(input().rstrip()))
# ์งํ,๋ถ ์์น ์ฐพ๊ธฐ
for i in range(R):
for j in range(C):
if maze[i][j] == 'J':
j_x,j_y = (i,j)
if maze[i][j] == 'F':
fire.append((i,j))
# ์ต๋จ ๊ฑฐ๋ฆฌ ์ฐพ๊ธฐ
def bfs(a,b):
q = deque([])
q.append([(a,b),'J'])
for i in range(len(fire)):
q.append([(fire[i][0],fire[i][1]),'F'])
visited = [[False]*C for _ in range(R)]
count = [[0]*C for _ in range(R)]
while q:
temp = q.popleft()
x,y = temp[0]
who = temp[1]
# ์งํ์ด ํ์ถ ์กฐ๊ฑด
if (x == 0 or x == R-1 or y == 0 or y == C-1) and who == 'J':
return count[x][y] + 1
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<R and 0<=ny<C and visited[nx][ny] == False and maze[nx][ny] != '#':
if who == 'J' and maze[nx][ny] == '.':
q.append([(nx,ny),'J'])
visited[nx][ny] = True
count[nx][ny] = count[x][y] + 1
if who == 'F' and maze[nx][ny] != 'F':
q.append([(nx,ny),'F'])
maze[nx][ny] == 'F'
return None
count = bfs(j_x,j_y)
if count == None:
print("IMPOSSIBLE")
else:
print(count)
TRY 3
import sys
input = sys.stdin.readline
from collections import deque
R,C = map(int,input().split())
maze = [] # ๊ทธ๋ํ
dx = [1,-1,0,0]
dy = [0,0,1,-1]
q = deque([])
for i in range(R):
maze.append(list(input().rstrip()))
# ์งํ ์์น ์ฐพ๊ธฐ
if 'J' in maze[i]:
q.append((i,maze[i].index('J'),0))
# ๋ถ ์์น ์ฐพ๊ธฐ
for i in range(R):
for j in range(C):
if maze[i][j] == 'F':
q.append((i,j,-1))
answer = "IMPOSSIBLE"
while q:
x,y,time = q.popleft()
# ์งํ์ด ํ์ถ ์กฐ๊ฑด
if (x == 0 or x == R-1 or y == 0 or y == C-1) and maze[x][y] != 'F' and time > -1:
answer = time + 1
break
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<R and 0<=ny<C and maze[nx][ny] != '#':
# ์งํ์ด
if time > -1 and maze[nx][ny] == '.':
q.append((nx,ny,time+1))
maze[nx][ny] = 'V'
# ๋ถ
elif time == -1 and maze[nx][ny] != 'F':
q.append((nx,ny,-1))
maze[nx][ny] = 'F'
print(answer)