728x90
SMALL
문제
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com

N*N차원의 배열이 주어질때, S에서 G로 가는 가장 작은 가중치를 찾는 문제이다.
풀이
- BFS기반의 다익스트라로 풀었다.
- num_maps에 (x,y)위치로 가기 위한 최단 경로가 저장된다
- 돌아가는 경우가 더 적은 가중치일 경우 업데이트 한다.
from collections import deque
def dijkstra(x,y):
dxs=(-1,1,0,0)
dys=(0,0,1,-1)
queue=deque()
queue.append((x,y))
num_maps[x][y]=0
visited.add((x,y))
while queue:
x,y=queue.popleft()
for i in range(4):
dx=dxs[i]
dy=dys[i]
if x+dx>=0 and x+dx<len(num_maps[0]) and y+dy>=0 and y+dy<len(num_maps[0]):
if num_maps[x][y]+maps[x+dx][y+dy]<num_maps[x+dx][y+dy]:
queue.append((x+dx,y+dy))
visited.add((x+dx,y+dy))
num_maps[x+dx][y+dy]=num_maps[x][y]+maps[x+dx][y+dy]
T=int(input())
for t in range(1,T+1):
N=int(input())
maps=[]
num_maps=[]
visited=set()
for i in range(N):
maps.append(list(map(int,input())))
num_maps.append([100001 for _ in range(N)])
dijkstra(0,0)
print(f"#{t} {num_maps[N-1][N-1]}")
생각해보니, 다익스트라는 보통 우선순위 큐를 이용해서 구현된다.
이 코드는 아래와 같다.
import heapq
def dijkstra(N, maps):
dxs = [-1, 1, 0, 0]
dys = [0, 0, -1, 1]
num_maps = [[float('inf')] * N for _ in range(N)]
num_maps[0][0] = 0
heap = []
heapq.heappush(heap, (0, 0, 0)) # (현재 비용, x 좌표, y 좌표)
while heap:
cost, x, y = heapq.heappop(heap)
if cost > num_maps[x][y]:
continue
for i in range(4):
nx, ny = x + dxs[i], y + dys[i]
if 0 <= nx < N and 0 <= ny < N:
new_cost = cost + maps[nx][ny]
if new_cost < num_maps[nx][ny]:
num_maps[nx][ny] = new_cost
heapq.heappush(heap, (new_cost, nx, ny))
return num_maps[N-1][N-1]
T = int(input())
for t in range(1, T + 1):
N = int(input())
maps = [list(map(int, input())) for _ in range(N)]
result = dijkstra(N, maps)
print(f"#{t} {result}")728x90
LIST
'코테공부' 카테고리의 다른 글
| python 백준 16926 배열 돌리기 1 (0) | 2025.02.05 |
|---|---|
| [SW Expert Academy]1954. 달팽이 숫자 (0) | 2024.11.18 |
| [SW Expert Academy] 1244. [S/W 문제해결 응용] 2일차 - 최대 상금 (0) | 2024.11.16 |
| [SW Expert Academy] 20936. 상자 정렬하기 (0) | 2024.11.15 |
| [SW Expert Academy] 2072. 홀수만 더하기 (0) | 2024.11.12 |