알고스팟
1261번: 알고스팟
첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미
www.acmicpc.net
- 풀이
- ⚠️이전에 도착한 거리와 지금 온 거리를 비교하려고 했더니 방문처리가 불가능한 문제에 직면!
- 벽을 부수는 최소 횟수이므로 벽을 최대한 안 부수는 곳으로 먼저 이동해야
- 한번 이동한 곳을 다시 가지 않으면서 최솟값을 가질 수 있다
- 벽이 없는 경우를 appendleft 로 먼저 확인하게 함
- → heapq를 쓰면 되는 방식ㅎ
- ⚠️이전에 도착한 거리와 지금 온 거리를 비교하려고 했더니 방문처리가 불가능한 문제에 직면!
from collections import deque
m, n = map(int, input().split())
graph = [list(map(int, input().rstrip())) for _ in range(n)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
distance = [[-1 for _ in range(m)] for _ in range(n)]
def bfs(i, j):
queue = deque()
queue.append((i, j))
distance[i][j] = 0
while queue:
x, y = queue.popleft()
for k in range(4):
nx = x+dx[k]
ny = y+dy[k]
if nx < 0 or ny < 0 or nx >= n or ny >= m:
continue
if distance[nx][ny] != -1:
continue
if graph[nx][ny] == 0:
distance[nx][ny] = distance[x][y]
queue.appendleft((nx, ny))
else:
distance[nx][ny] = distance[x][y]+1
queue.append((nx, ny))
bfs(0, 0)
print(distance[n-1][m-1])
- 다른 풀이
- 다익스트라
import heapq
m, n = map(int, input().split())
graph = [list(map(int, input().rstrip())) for _ in range(n)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
distance = [[int(1e9) for _ in range(m)] for _ in range(n)]
def dijkstra():
queue = []
heapq.heappush(queue, (0, 0, 0))
distance[0][0] = 0
while queue:
cost, x, y = heapq.heappop(queue)
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if nx < 0 or ny < 0 or nx >= n or ny >= m:
continue
if cost+graph[nx][ny] < distance[nx][ny]:
distance[nx][ny] = cost+graph[nx][ny]
heapq.heappush(queue, (distance[nx][ny], nx, ny))
dijkstra()
print(distance[n-1][m-1])
'코딩테스트 > BOJ' 카테고리의 다른 글
| [백준][DP] 2293. 동전 1 (0) | 2024.02.23 |
|---|---|
| [백준][DP] 9095. 1,2,3 더하기 (0) | 2024.02.22 |
| [백준][DP] 5557. 1학년 (1) | 2024.02.16 |
| [백준][그리디] 1339. 단어 수학 (0) | 2024.02.15 |
| [백준] [DP] 11052. 카드 구매하기 (0) | 2024.01.12 |