[Baekjoon/๐ฅโ ข] 2206: ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐโญ๏ธ
๐โโ๏ธ ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ
NรM์ ํ๋ ฌ๋ก ํํ๋๋ ๋งต์ด ์๋ค. ๋งต์์ 0์ ์ด๋ํ ์ ์๋ ๊ณณ์ ๋ํ๋ด๊ณ , 1์ ์ด๋ํ ์ ์๋ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ๋น์ ์ (1, 1)์์ (N, M)์ ์์น๊น์ง ์ด๋ํ๋ ค ํ๋๋ฐ, ์ด๋ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ค ํ๋ค. ์ต๋จ๊ฒฝ๋ก๋ ๋งต์์ ๊ฐ์ฅ ์ ์ ๊ฐ์์ ์นธ์ ์ง๋๋ ๊ฒฝ๋ก๋ฅผ ๋งํ๋๋ฐ, ์ด๋ ์์ํ๋ ์นธ๊ณผ ๋๋๋ ์นธ๋ ํฌํจํด์ ์ผ๋ค.
๋ง์ฝ์ ์ด๋ํ๋ ๋์ค์ ํ ๊ฐ์ ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ๋ ๊ฒ์ด ์ข ๋ ๊ฒฝ๋ก๊ฐ ์งง์์ง๋ค๋ฉด, ๋ฒฝ์ ํ ๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ์ฌ๋ ๋๋ค.
ํ ์นธ์์ ์ด๋ํ ์ ์๋ ์นธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ด๋ค.
๋งต์ด ์ฃผ์ด์ก์ ๋, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด ๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐โโ๏ธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 โค N โค 1,000), M(1 โค M โค 1,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ M๊ฐ์ ์ซ์๋ก ๋งต์ด ์ฃผ์ด์ง๋ค. (1, 1)๊ณผ (N, M)์ ํญ์ 0์ด๋ผ๊ณ ๊ฐ์ ํ์.
๐โโ๏ธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ถ๊ฐ๋ฅํ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
๐ฉโ๐ป ์ด๋ป๊ฒ ํ์ด๋๊ฐ๊น?
์ฐ์ ๊ทธ๋ํ ํ์, ์ต๋จ๊ฑฐ๋ฆฌ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ bfs๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํด๋น ๋ฌธ์ ๋ ์ผ๋ฐ bfs ๋ฌธ์ ์์ ์กฐ๊ฑด์ด ์ถ๊ฐ๋ ๋ฌธ์ ์ด๋ค.
๋ง์ฝ์ ์ด๋ํ๋ ๋์ค์ ํ ๊ฐ์ ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ๋ ๊ฒ์ด ์ข ๋ ๊ฒฝ๋ก๊ฐ ์งง์์ง๋ค๋ฉด, ๋ฒฝ์ ํ ๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ์ฌ๋ ๋๋ค.
์ฒ์์๋ ๋ฒฝ์ ์ขํ๋ฅผ ๋ชจ๋ ๊ธฐ๋กํด ๊ฐ๊ฐ์ ๊ฒฝ์ฐ์์ ๋ซ์์ ๋ bfs ๋ฐ๋ณตํด์ ํธ์ถํ์๋ค. ๋น์ฐํ ๊ฒฐ๊ณผ๋ ์๊ฐ์ด๊ณผ์๋ค!
๊ฐ๋จํ ์กฐ๊ฑด ํ๋๋ง ์ถ๊ฐ๋ ๊ฒ์ธ๋ฐ ๊ตฌํ์ ๊ฝค ์ ๋ฅผ ๋จน์๋ค.
๋จ ํ ๋ฒ์ bfs ํธ์ถ์ ํตํด ๋ฒฝ์ ๋ถ์๋ ๊ฒฝ์ฐ๊น์ง ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋น๊ต์ ๊ฐ๋จํ๋ค. ๋จ์ํ ๋ฒฝ์ ๋ถ์ ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํ๋ฉด ๋๋ค.
๋ฒฝ์ 1๋ฒ์ด๋ผ๋ ๋ถ์ ๊ฒฝ์ฐ์๋ ์ดํ ๋ฒฝ์ ๋ง๋ฌ์ ๋ ๊ฒฝ๋ก๊ฐ ๋งํ๊ฒ ๋๋ค. ํ์ง๋ง ๋ฒฝ์ ํ ๋ฒ๋ ๋ถ์์ง ์์ ๊ฒฝ์ฐ, ์ดํ ๋ฒฝ์ ๋ง๋ฌ์ ๋ ํด๋น ๊ฒฝ๋ก๋ฅผ ๋ซ๊ณ bfs๋ฅผ ์งํํ๋ฉด ๋๋ค!
๊ทธ๋ ๋ค๋ฉด ๊ทธ ์ฝ๋๋ฅผ ์๋์์ ํ์ธํด๋ณด์!!
๐ฉโ๐ป Code: ์ค๋ต
import sys
from collections import deque
INF = sys.maxsize
def bfs():
global answer
q = deque([(1, 0, 0, False)])
visited = [[0]*m for _ in range(n)]
visited[0][0] = 1
while q:
dis, x, y, check = q.popleft()
if x == n-1 and y == m-1:
answer = min(dis, answer)
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<n and 0<=ny<m:
if graph[nx][ny] == "0": # ๋ฒฝ์ด ์๋ ๊ฒฝ์ฐ
if visited[nx][ny] == 0:
visited[nx][ny] = 1
q.append((dis+1, nx, ny, check))
else: # ๋ฒฝ์ผ ๊ฒฝ์ฐ
if check == False:
q.append((dis+1, nx, ny, True))
return answer
n, m = map(int, sys.stdin.readline().split())
graph = [list(sys.stdin.readline().rstrip()) for _ in range(n)]
walls = []
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
answer = INF
bfs()
if answer == INF:
print(-1)
else:
print(answer)
ํ์ง๋ง ํด๋น ์ฝ๋๋ ์ ๋ชฉ์์ ์ ์ ์๋ฏ์ด ์ค๋ต์ธ ์ฝ๋์ด๋ค!
๋๋์ฒด ์????๐ซ
์ด๋ ๋ถ๋ถ์์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ง ๋ชปํ์๊น ๊ณ์ ๊ณ ๋ฏผํ๋ ์ค, ๋ค๋ฅธ ๋ถ์ด ํ ์ง๋ฌธ ๋๋ถ์ ์์ธ์ ์ฐพ์ ์ ์์๋ค..ใ ใ
๐ฉโ๐ป Code1: ์์ธ ์ผ์ด์ค
์ ์ฝ๋๋ ๋ค์์ ์์ธ ์ผ์ด์ค๋ฅผ ๊ฐ์ง๋ค.
4 6
010100
010110
000110
111110
- (0,1)์์ ๋ฒฝ์ ๋ถ์๊ณ ๊ฐ ๊ฒฝ์ฐ
- (0, 2)๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋๋ค.
- (0, 3)์์ ๋ค์ ๋ฒฝ์ ๋ง๋ ๊ฒฝ๋ก๋ฅผ ๋ง๋ฌด๋ฆฌํ๊ฒ ๋๋ค.
- (0, 1)์์ ๋ฒฝ์ ๋ถ์์ง ์์ ๊ฒฝ์ฐ
- U์ ํํ๋ก ๋๊ณ ๋์ (0, 2)๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค.
- ํ์ง๋ง ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๊ฐ ์ด๋ฏธ ๋์ด ์์ผ๋ฏ๋ก ๊ฒฝ๋ก๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ค.โญ๏ธ
์ฆ, ๋ฒฝ์ ๋ถ์ ๊ฒฝ์ฐ์ ๋ถ์์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๋ถ๋ฆฌํด ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ ์ ์ฅํด์ผ ํ๋ค. ๊ทธ ์ด์ ๋ ๋จ์ํ๋ค!
๋ฒฝ์ ๋ถ์ ๊ฒฝ์ฐ์ ๋ถ์์ง ์์ ๊ฒฝ์ฐ์ ๊ฒฝ๋ก๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ฒฝ์ ๋ถ์ ์ํ์์ (0,2)์ ๋์ฐฉํ ๊ฒฝ์ฐ, (0,3)์์ ๋ฒฝ์ ๋ง๋ ๊ฒฝ๋ก๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ค.
- ๋ฒฝ์ ๋ถ์์ง ์์ ์ํ์์ (0, 2)์ ๋์ฐฉํ ๊ฒฝ์ฐ, (0, 3)์์ ๋ฒฝ์ ๋ง๋๋๋ผ๋ ๋ฒฝ์ ๋ถ์๊ณ ๋์๊ฐ ์ ์๋ค.
์ด์ ์ด๋ฅผ ์ ์ฉํ ์ฝ๋๋ฅผ ํ์ธํด๋ณด์!
๐ฉโ๐ป Code: ์ ๋ต
import sys
from collections import deque
INF = sys.maxsize
def bfs():
global answer
q = deque([(1, 0, 0, False)])
# ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ ๋ถ๋ฆฌ!
visited1 = [[0]*m for _ in range(n)]
visited2 = [[0]*m for _ in range(n)]
visited1[0][0] = 1
while q:
dis, x, y, check = q.popleft()
if x == n-1 and y == m-1:
return dis
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<n and 0<=ny<m:
if graph[nx][ny] == "0": # ๋ฒฝ์ด ์๋ ๊ฒฝ์ฐ
if not check: # ๋ฒฝ์ ํ๋ฌผ์ง ์๊ณ ์ง๋๊ฐ๋ ๊ฒฝ์ฐ
if visited1[nx][ny] == 0:
visited1[nx][ny] = 1
q.append((dis+1, nx, ny, check))
else: # ๋ฒฝ์ ํ๋ฌผ๊ณ ์ง๋๊ฐ๋ ๊ฒฝ์ฐ
if visited2[nx][ny] == 0:
visited2[nx][ny] = 1
q.append((dis+1, nx, ny, check))
else: # ๋ฒฝ์ผ ๊ฒฝ์ฐ
if check == False:
q.append((dis+1, nx, ny, True))
return -1
n, m = map(int, sys.stdin.readline().split())
graph = [list(sys.stdin.readline().rstrip()) for _ in range(n)]
walls = []
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
print(bfs())
bfs ๋ฌธ์ ๋ผ๊ณ ๋ค ๋๊ฐ์ ๋ฌธ์ ๋ ์๋๊ตฌ๋๋ฅผ ํ์คํ ๋๋ ๋ฌธ์ ์๋ค. ๋ค๋ฅธ ์กฐ๊ฑด์ด ๋ถ์ bfs ๋ฌธ์ ๋ ํด๋น ๋ฌธ์ ํ์ด๋ฅผ ์ฐธ๊ณ ํด ์ ํ์ด๋๊ฐ ์ ์์ ๊ฒ ๊ฐ์ ๋๋~
๋๊ธ๋จ๊ธฐ๊ธฐ