https://leetcode.com/problems/minimum-cost-to-make-at-least-one-valid-path-in-a-grid/description/
코드
from collections import deque
def minCost(grid):
n = len(grid)
m = len(grid[0])
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
count = [[int(1e9)]*m for _ in range(n)]
count[0][0] = 0
q = deque([(0, 0)])
while q:
x, y = q.popleft()
if x == n-1 and y == m-1:
continue
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0 <= nx < n and 0 <= ny < m:
# 여기서 방향 바꿈
if i != grid[x][y]-1 and count[x][y]+1 < count[nx][ny]:
q.append((nx, ny))
count[nx][ny] = count[x][y]+1
# 방향 안 바꿈
elif i == grid[x][y]-1 and count[x][y] < count[nx][ny]:
q.append((nx, ny))
count[nx][ny] = count[x][y]
return count[n-1][m-1]
BFS는 보통 최적의 해, 그러니까 이런 격자 내의 경로 문제에서는 최단 경로를 구할 때 많이 사용하는데, 이 문제는 그런 경우가 아니다. 이 문제에서는 경로의 길이가 아닌 방향 변경 횟수를 최소로 가지며 목적지에 도달하는 것을 구하고 있다.
그래서 위 코드에서는 목적지인 `(n-1, m-1)`에 도달했다 하더라도 바로 끝내지 말고, 남은 큐에 대해서도 다 처리하도록 했다. 왜냐하면 더 긴 거리를 걸려서 오더라도 방향 변경 횟수가 더 적은 경로가 있을 가능성이 있기 때문이다. 처음 발견한 경로가 방향 변경 횟수 측면에서 최적이라는 보장이 없으므로, 모든 가능한 경로를 탐색해야 한다.
'문제풀이 > DFS_BFS' 카테고리의 다른 글
[Python/파이썬] 백준 11967번 불켜기 (0) | 2025.04.28 |
---|---|
[Python/파이썬] 백준 19238번 스타트 택시 (0) | 2025.04.27 |
[Python/파이썬] 백준 1595번 북쪽나라의 도로 (0) | 2025.04.10 |
[Javascript/자바스크립트] 프로그래머스 게임 맵 최단거리 (0) | 2025.03.21 |
[Python/파이썬] 백준 1039번 교환 (0) | 2025.03.14 |