๐จ ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ
๋ฐฑ์ค Class4 Gold4
solved_ac[Class4] ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ
๋ฌธ์
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
์์ ์ถ๋ ฅ 1
15
์์ ์ ๋ ฅ 2
4 4
0111
1111
1111
1110
์์ ์ถ๋ ฅ 2
-1
๐ ์๋ฃ๊ตฌ์กฐ
[BFS + ๊ตฌํ]์ด์๋ค. ๋ค๋ง ๊ทธ ๊ตฌํ ๋ถ๋ถ์ด ๋ฌด์ฒ ์ด๋ ค์ ๋ค.
TRY 1
์ฒ์์๋ Brute Force๋ก ์ ๊ทผํ์๋ค. ๋ชจ๋ ๋ฒฝ์ ๋ํ์ฌ ํ ๋ฒ์ฉ ์ ๊ฑฐํด๋ณด๋ฉฐ ์ ์ผ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
๐๐ป ์๊ฐ ์ด๊ณผ
TRY 2
โTRY 1โ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ ์ด์ ๋ ์๊ฐ๋ณต์ก๋๊ฐ O(N^2)์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ์ค์ฌ์ผ ํ๋๋ฐ ๋์ ํ ์๊ฐ์ด ์ ๋ฌ๋ค.
๋ํ์ด๊ฐ <3์ฐจ์>์ด๋ผ๋ ํํธ๋ฅผ ์ค์ ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ค์ ์๊ฐ์ ํด ๋ณด์๋ค.
- ๋ฒฝ์ ์ ๋ถ์๋ ๊ฒฝ์ฐ์ ๋งต
- ๋ฒฝ์ ๋ถ์๋ ๊ฒฝ์ฐ์ ๋งต
์ด๋ ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋์ด์ ํ์์ ์งํํ๋ฉด ๋์ง ์์๊น ํ๊ณ ์งํ ๊ณผ์ ์ ๊ทธ๋ ค๋ณด์๋ค.
๊ธธ ํน์ ๋ฒฝ ์ค๋ฅธ์ชฝ์ ์๋ ๋ถํ์ ์ซ์๊ฐ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ์๋ฏธํ๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ํ์ ๊ฒฝ์ฐ ๋ฒฝ์ 2๋ฒ ์ด์ ๋ถ์๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ์ฌ ์ค๋ต์ด๋ค.
๐๐ป ์ค๋ต
TRY 3
์๊ฐ ๊ด๊ณ์ ๊ฒฐ๊ตญ ์๋ฃจ์ ์ ์ฐธ๊ณ ํ์๋ค. https://hongcoding.tistory.com/18
๐จ๐ปโ๐ป CODE
TRY 1
import sys
from collections import deque
import copy
input = sys.stdin.readline
N,M = map(int,input().split())
graph = [[0]*M for _ in range(N)]
# ๋งต ์์ฑ
for i in range(N):
line = input()
for j in range(M):
graph[i][j] = int(line[j])
dx = [1,-1,0,0]
dy = [0,0,1,-1]
# BFS๋ก ์ต๋จ๊ฑฐ๋ฆฌ ํ์
def bfs(a,b,graph):
q = deque([(a,b)])
while q:
x,y = q.popleft()
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<N and 0<=ny<M and graph[nx][ny] == 0:
q.append((nx,ny))
graph[nx][ny] = graph[x][y] + 1
lst_answer = []
for i in range(N):
for j in range(M):
if graph[i][j] == 1:
temp = copy.deepcopy(graph)
temp[i][j] = 0
bfs(0,0,temp)
if temp[N-1][M-1] == 0:
continue
lst_answer.append(temp[N-1][M-1]+1)
if not lst_answer:
print(-1)
else:
print(min(lst_answer))
TRY 3
import sys
from collections import deque
input = sys.stdin.readline
N,M = map(int,input().split())
graph = [[0]*M for _ in range(N)]
# visited[x][y][0] --> ๋ฒฝ ํ๊ดด ๊ธฐํ O
# visited[x][y][1] --> ๋ฒฝ ํ๊ดด ๊ธฐํ X
visited = [[[0]*2 for _ in range(M)] for _ in range(N)]
# ๋งต ์์ฑ
for i in range(N):
line = input()
for j in range(M):
graph[i][j] = int(line[j])
dx = [1,-1,0,0]
dy = [0,0,1,-1]
# BFS๋ก ์ต๋จ๊ฑฐ๋ฆฌ ํ์
def bfs(a,b,c):
visited[a][b][c] = 1
q = deque([(a,b,c)])
while q:
x,y,z = q.popleft()
# ๋ ์ง์ ๋๋ฌ
if x == N-1 and y == M-1:
return visited[x][y][z]
# ์ํ์ข์ฐ ํ์ ํด๋ด
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<N and 0<=ny<M and visited[nx][ny][z] == 0:
# Case1. ๋ฒฝ & ๋ฒฝ ํ๊ดด ๊ธฐํ O
# --> (nx,ny) ๋ฒฝ ํ๊ดด ๊ธฐํ ์ญ์ & ํ์ ์ถ๊ฐ(์ด๋)
if graph[nx][ny] == 1 and z == 0:
visited[nx][ny][1] = visited[x][y][0] + 1
q.append((nx,ny,1))
# Case2. ๋ฒฝ & ๋ฒฝ ํ๊ดด ๊ธฐํ X
# --> ์ด๋ ๋ถ๊ฐ
# Case3. ๊ธธ
# --> ์ด๋
if graph[nx][ny] == 0:
visited[nx][ny][z] = visited[x][y][z] + 1
q.append((nx,ny,z))
return -1
print(bfs(0,0,0))