[BOJ][๐ก4][๋ฐฑ์ค#02206] ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
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์ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
6 4
0100
1110
1000
0000
0111
0000
์ถ๋ ฅ
15
์์ 2
์ ๋ ฅ
4 4
0111
1111
1111
1110
์ถ๋ ฅ
-1
My Sol : ์ค๋ต
from collections import deque
def BFS(v):
Q = deque()
Q.append((0, 0, 0))
visit[0][0][0] = 1
ql = 1
cnt = 1
while Q:
for _ in range(ql):
ni, nj, bw = Q.popleft()
ql -= 1
if ni==I-1 and nj==J-1: return cnt
for di, dj in ((-1,0),(1,0),(0,-1),(0,1)):
si, sj = ni+di, nj+dj
if not (0<=si<I and 0<=sj<J): continue
sw = bw + mat[si][sj]
if sw > 1: continue
if visit[si][sj][sw]: continue
visit[si][sj][sw] = 1
Q.append((si, sj, sw))
ql += 1
cnt += 1
return -1
I, J = map(int, input().split())
mat = [list(map(int, input())) for _ in range(I)]
visit = [[[0]*3 for _ in range(J)] for _ in range(I)]
print(BFS(mat))
BFS๋ฅผ ์ด์ฉํ๋๋ฐ, 3์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํด ํน์ดํ๊ฒ ํธ๋ ๋ฌธ์ ์๋ค. ๋ช ์๊ฐ์ ๋งค๋ฌ๋ฆฌ๊ณ ๋ช ๋ฒ์ ํ์ด๋ ํ๋ ค์ ๊ฒฐ๊ตญ ๋ต์ ์ฐธ๊ณ ํ๊ณ , ๋ฐฉ์์ ์๋๋ฐ๋ ๊ณ์ ValueError๋ก ์ค๋ต์ด ๋ด๋ค. (๋์ค์ ์์์ง๋ง sys.stdin.readline ์ค๋ฅ์๋ค.) Queue์ ์๋ฅผ ๋ง์ด ๋ฃ๊ณ ์ถ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ณ์ฐ๋ ํ์์ขํ๋ฅผ ํ์ธํด์ ๋ชฉํ์ขํ์ธ I-1๊ณผ J-1์ด๋ผ๋ฉด cnt+1์ ์ถ๋ ฅํ๋๋ก ์ค์ ํ๋๋ฐ, ๊ณ์ ํ๋ ค์ ์ขํ๋ฅผ ๋ชจ๋ ๋ฃ๊ณ , ํ์ฌ ์ขํ๊ฐ ๋ชฉํ ์ขํ์ธ ๊ฒฝ์ฐ cnt๋ฅผ ์ถ๋ ฅํ๋๋ก ๋ฐ๊ฟจ๋ค. ๋ฌด์จ ์ฐจ์ด๊ฐ ์๋์ง๋ ์์ ๋ชจ๋ฅด๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
from collections import deque
di, dj = ((-1, 1, 0, 0), (0, 0, -1, 1))
N, M = map(int, input().split())
arr = [list(map(int, input())) for _ in range(N)]
visited = [[[0 for _ in range(M)] for _ in range(N)] for _ in range(2)] # ๋ฒฝ์ ๋ง๋ฌ์ ๋์ ์ ๋ง๋ฌ์ ๋์ 3์ฐจ์ ๋ฐฐ์ด ์์ฑ
queue = deque()
visited[0][0][0] = 1
queue.append([0, 0, 0])
if N == 1 and M == 1 and arr[0][0] == 0:
print(1)
else:
flag = 0
while queue:
x, y, z = queue.popleft()
for i in range(4):
ni = x + di[i]
nj = y + dj[i]
# ๋ฒ์ ๋ด์ด๊ณ ๋ฐฉ๋ฌธํ์ง ์์์ ๋
if 0 <= ni < N and 0 <= nj < M and visited[z][ni][nj] == 0:
# ๋ฒฝ์ ๋ง๋ฌ์ ๋
if arr[ni][nj] == 1 and z == 0:
visited[1][ni][nj] = visited[0][x][y] + 1
queue.append((ni, nj, 1))
# ๋ฒฝ์ ๋ง๋์ง ์์์ ๋
elif arr[ni][nj] == 0:
visited[z][ni][nj] = visited[z][x][y] + 1
queue.append([ni, nj, z])
# ๋์ฐฉํ์ ๋
if ni == N-1 and nj == M-1:
print(visited[z][ni][nj])
flag = 1
break
# ๋์ฐฉํ์ผ๋ฉด while ๋ฌธ ์ข
๋ฃ
if flag == 1:
break
# ๋์ฐฉ์ง์ ์ ๊ฐ์ง ๋ชปํ์ ๋
if flag == 0:
print(-1)
ํ์ ์๊ฐ์ด ์ ๋ฐ์ ๋ฌํ๋ ๋ต์์ด ์์ด์ ๋ถ์ํด๋ณด๋ ค๊ณ ํ๋ค. ์ญ์ 3์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ๊ณ , ์ํฉ์ ๋๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ จ๋ค. queue์๋ tuple๊ณผ list๋ฅผ ํผ์ฉํด์ ๋ฃ์๋๋ฐ ์ด์ฐจํผ queue์์ ๋บ ๋ unpackingํด์ ํ์ฉํ๋ฏ๋ก ํฌ๊ฒ ์๊ด์ ์์ผ๋ ์ค์์ธ ๊ฒ ๊ฐ๋ค. ํน์ดํ ๊ฒ์ visited์ ์ด์ ๊ฐ์ผ๋ก๋ถํฐ 1์ ๋ํ๋ ๋ฐฉ์์ ํ์ฉํ์๋ค. ๋๋ while๋ฌธ์ queue ๊ธธ์ด๋งํผ ๋๋ฆฌ๋ฉด cnt๋ฅผ 1 ์ฌ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์์ฑํ๋๋ฐ, ์ด ๋ฐฉ๋ฒ์ด ๋ ๊ธฐ์ด์ ์ธ ๋ฐฉ์์ด์ง๋ง ์ด๋ฒ ๋ฌธ์ ์ ๊ฒฝ์ฐ์๋ ํ์ด์ ์ข์๋ค๊ณ ์๊ฐํ๋ค.
๋ฒฝ์ ๋ง๋ฌ๊ณ z๊ฐ 0, ์ฆ ์์ง ๋ฒฝ์ ๋ถ์์ง ์์ ๊ฒฝ์ฐ์ผ ๋์๋ z=1๋ก ํ์ฌ ํ์ ์ขํ๋ฅผ queue์ ์ถ๊ฐํ๊ณ visited์ ๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ๊ณผ ๋ฒฝ์ ๋ง๋์ง ์์๋ค๋ฉด ๊ทธ๋ฅ ๊ทธ ์ด์ ์ ๊ฐ + 1 ์ผ๋ก visited์ ์ฒ๋ฆฌํ๊ณ queue์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด ์ข์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ