𧱠벽λΆμκ³ μ΄λνκΈ°
- μκ°μ ν: 2μ΄
- λ©λͺ¨λ¦¬ μ ν: 192MB
π λ¬Έμ
- N x Mμ νλ ¬λ‘ ννλλ λ§΅μ΄ μλ€.
- 맡μμλ 0μ μ΄λν μ μλ κ³³μ λνλ΄κ³ , 1μ μ΄λν μ μλ λ²½μ΄ μλ κ³³μ λνλΈλ€.
- λΉμ μ (1,1) μμ (N, M)μ μμΉκΉμ§ μ΄λνλ € νλλ°, μ΄λ μ΅λ¨ κ²½λ‘λ‘ μ΄λνλ € νλ€.
- μ΅λ¨κ²½λ‘λ 맡μμ κ°μ₯ μ μ κ°μμ μΉΈμ μ§λλ κ²½λ‘λ₯Ό λ§νλλ°, μ΄λ μμνλ μΉΈκ³Ό λλλ μΉΈλ ν¬ν¨ν΄μ μΌλ€.
- λ§μ½μ μ΄λνλ λμ€μ ν κ°μ λ²½μ λΆμκ³ μ΄λνλ κ²μ΄ μ’ λ κ²½λ‘κ° μ§§μμ§λ€λ©΄, λ²½μ ν κ° κΉμ§ λΆμκ³ μ΄λνμ¬λ λλ€.
- ν μΉΈμμ μ΄λν μ μλ μΉΈμ μνμ’μ°λ‘ μΈμ ν μΉΈμ΄λ€.
- λ§΅μ΄ μ£Όμ΄μ‘μ λ, μ΅λ¨ κ²½λ‘λ₯Ό ꡬν΄λ΄λ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
- 첫 μ€μ N(1 <= N <= 1000), M(1 <= M <= 1000)μ΄ μ£Όμ΄μ§λ€.
- λ€μ Nκ°μ μ€μ Mκ°μ μ«μλ‘ λ§΅μ΄ μ£Όμ΄μ§λ€.
- (1,1)κ³Ό (N, M)μ νμ 0μ΄λΌκ³ κ°μ νμ.
μΆλ ₯
- 첫째 μ€μ μ΅λ¨ 거리λ₯Ό μΆλ ₯νλ€. λΆκ°λ₯ν λλ -1μ μΆλ ₯νλ€.
π‘ λ¬Έμ μ κ·Ό μμ΄λμ΄
- (1, 1)κ³Ό (N, M) κ°κ° ν, μ°μ μ, μ’κ° 1μΈ κ²½μ° == -1
- κ°λ€κ° κΈΈμ΄ λκΈ°λ κ²½μ° == -1
- DFS μκ³ λ¦¬μ¦
β 2% νλ Έμ΅λλ€.
- λ무 λ¨μνκ² μμ μ½λμλ§ λ§μΆ°μ μκ°ν κ² κ°λ€.
- λ€μ μκ°ν΄λ³΄μ.
- DFSκ° μλλΌ BFSλ‘ νμ΄μΌ νλκ² λ§λ κ² κ°μ!
from sys import stdin
input = stdin.readline
N, M = map(int, input().split())
walls = []
for _ in range(N):
walls.append(list(map(int, input().strip())))
# (1,1)κ³Ό (N,M)μ΄ 1λ‘ κ°λ‘λ§ν μλμ§ νμΈ
start = walls[0][1] and walls[1][0]
end = walls[N-1][M-2] and walls[N-2][M-1]
if start and end:
print(-1)
exit()
def dfs(graph, start):
# start (x, y, value, walls-flag)
stack = [start]
# directions
directionsX = [1, -1, 0, 0]
directionsY = [0, 0, -1, 1]
while stack:
x, y, value, flag = stack.pop()
# print(x, y, value, flag)
# for g in graph:
# print(g)
# print()
graph[x][y] = min(value, graph[x][y]) if graph[x][y] > 1 else value
for i in range(len(directionsX)):
nx, ny = x + directionsX[i], y + directionsY[i]
if 0 <= nx < N and 0 <= ny < M and graph[nx][ny] in [0, 1]:
if flag:
if graph[nx][ny] == 0:
stack.append((nx, ny, value + 1, flag))
else:
if graph[nx][ny] == 1:
stack.append((nx, ny, value + 1, True))
else:
stack.append((nx, ny, value + 1, flag))
return graph
result = dfs(walls, (0, 0, 2, False))
if result[N-1][M-1] > 1:
print(result[N-1][M-1] - 1)
else:
print(-1)
β λ©λͺ¨λ¦¬ μ΄κ³Ό >> μ΄λ°,,
- visited checkν λ set μ¬μ©, 4 tuple μ¬μ© λ± μ΄μλ‘ λ©λͺ¨λ¦¬ μ΄κ³Όκ° λ κ² κ°λ€λ μμ >> 3μ°¨μ λ°°μ΄λ‘ visited μ μΈν΄μ λ°©λ¬Έ 체ν¬λ‘ λ³κ²½
from sys import stdin
from collections import deque
input = stdin.readline
N, M = map(int, input().split())
walls = []
for _ in range(N):
walls.append(list(map(int, input().strip())))
# (1,1)κ³Ό (N,M)μ΄ 1λ‘ κ°λ‘λ§ν μλμ§ νμΈ
start = walls[0][1] and walls[1][0]
end = walls[N-1][M-2] and walls[N-2][M-1]
if start and end:
print(-1)
exit()
def bfs(graph, start):
# start (x, y, value, walls-flag)
queue = deque([start])
# directions
directionsX = [-1, 1, 0, 0]
directionsY = [0, 0, 1, -1]
while queue:
x, y, value, flag = queue.popleft()
# print(x, y, value, flag)
# for g in graph:
# print(g)
# print(graph[x][y], value)
# print()
graph[x][y] = min(value, graph[x][y]) if graph[x][y] > 1 else value
for i in range(len(directionsX)):
nx, ny = x + directionsX[i], y + directionsY[i]
if 0 <= nx < N and 0 <= ny < M and graph[nx][ny] in [0, 1]:
if flag:
if graph[nx][ny] == 0:
queue.append((nx, ny, value + 1, flag))
else:
if graph[nx][ny] == 1:
queue.append((nx, ny, value + 1, True))
else:
queue.append((nx, ny, value + 1, flag))
return graph
result = bfs(walls, (0, 0, 2, False))
if result[N-1][M-1] > 1:
print(result[N-1][M-1] - 1)
else:
print(-1)
# 7 4
# 0000
# 1110
# 1000
# 1000
# 0000
# 0111
# 0000
# answer: 10
β μ±κ³΅ μ½λ
from sys import stdin
from collections import deque
input = stdin.readline
N, M = map(int, input().split())
walls = []
for _ in range(N):
walls.append(list(map(int, input().strip())))
def bfs(graph, start):
queue = deque([start])
visited = [[[0, 0] for _ in range(M)] for _ in range(N)]
visited[0][0][0] = 1 # μμμ λ°©λ¬Έ νμ
# directions
directions = [(-1, 0), (1, 0), (0, 1), (0, -1)]
while queue:
x, y, flag = queue.popleft()
if x == N - 1 and y == M - 1:
return visited[x][y][flag]
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < N and 0 <= ny < M:
# λ²½μ΄ μλκ³ μμ§ λ°©λ¬Ένμ§ μμ κ²½μ°
if graph[nx][ny] == 0 and visited[nx][ny][flag] == 0:
visited[nx][ny][flag] = visited[x][y][flag] + 1
queue.append((nx, ny, flag))
# λ²½μ΄κ³ μμ§ λ²½μ λΆμμ§ μμ κ²½μ°
elif graph[nx][ny] == 1 and flag == 0 and visited[nx][ny][1] == 0:
visited[nx][ny][1] = visited[x][y][0] + 1
queue.append((nx, ny, 1))
# λλ¬ν μ μμ κ²½μ°
return -1
print(bfs(walls, (0, 0, 0)))
# 7 4
# 0000
# 1110
# 1000
# 1000
# 0000
# 0111
# 0000
# answer: 10
728x90
'Algorithm&CodingTest > Baekjoon' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Baekjoon][14499] 골λ4 μ£Όμ¬μ ꡴리기 - Python (0) | 2024.10.08 |
---|---|
[Beakjoon][14502] 골λ4 μ°κ΅¬μ - Python (0) | 2024.10.08 |
[Beakjoon][7576] 골λ5 - ν λ§ν Python (0) | 2024.10.07 |
[Beakjoon][19637] μ€λ²3 - IFλ¬Έ μ’ λμ μ¨μ€ Python (0) | 2024.05.05 |
[Baekjoon] [20310] μ€λ²3 - νλ Έμ€ Python (0) | 2024.05.05 |