| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 백준 후보 추천하기
- 백준 특정거리의도시찾기
- 백준 10157
- 백준 1713
- 백준 2012
- 백준 주사위 쌓기
- 백준2823
- 백준 십자카드 문제
- 백준18230
- 백준 트리
- 백준 4803
- 백준 자리배정
- 백준18352
- 백준 등수매기기
- 백준13164
- 백준 최소비용 구하기
- 눈높이개발
- 백준 5212
- 예쁜타일링
- 백준
- Python
- 백준 유턴 싫어
- 백준 13901
- 파이썬
- 알고리즘
- 백준 2659
- 14247
- 백준 지구 온난화
- 백준2116
- 백준 로봇
- Today
- Total
개발 기록
[알고리즘|파이썬] 백준 1916 최소비용 구하기 본문
문제 링크: https://www.acmicpc.net/problem/1916
📌 문제 탐색하기
시간 제한: 0.5 초
메모리 제한: 128 MB
✏️ 구해야 하는 정답
N개의 노드, M개의 엣지가 주어지고, 각 엣지에는 가격이 매겨진다. 시작, 종료 노드가 주어졌을때 최소 비용을 구하시오.
조건
- 1 ≤ N ≤ 1,000
- 1 ≤ M ≤ 100,000
- 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수
📌 풀이하기
예시 1.
5
8
1 2 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
1 5
그림으로 나타내면 아래와 같다.

1️⃣ 그래프를 인접 리스트 형태로 표현
주어진 M개의 버스 정보를 기반으로 단방향 그래프를 구성한다.
인접 리스트(Adjacency List)를 사용하여 그래프를 저장한다.
graph[A] 리스트에 (B, 비용) 형태로 저장하여 출발 도시 A에서 도착 도시 B까지 가는 비용을 나타낸다.
2️⃣ 다익스트라 알고리즘 적용
다익스트라 알고리즘을 사용하여 출발 도시에서 각 도시까지의 최소 비용을 구한다.
우선순위 큐(힙, heapq)를 활용하여 가장 적은 비용의 노드를 우선 탐색한다.
거리 정보(distance[])를 유지하며 더 작은 비용이 발견되면 갱신한다.
최종적으로 distance[end] 값을 출력하면 최소 비용을 구할 수 있다.
📌 코드 설계하기
1. N개의 도시와 M개의 버스 정보를 입력받는다.
2. 인접 리스트(graph[])를 만들어 (도착지, 비용) 형태로 저장한다.
다익스트라 함수 실행
1. 최단 거리 테이블 (distance[])을 무한대(INF)로 초기화한다.
2. 우선순위 큐를 사용하여 비용이 작은 노드부터 탐색한다.
3. 현재 노드에서 갈 수 있는 모든 인접 노드를 확인하며 더 작은 비용으로 이동할 수 있으면 갱신한다.
4. 모든 노드를 탐색한 후, distance[end] 값을 출력한다.
📌 정답 코드
import sys
import heapq
input = sys.stdin.readline
n = int(input().strip())
m = int(input().strip())
graph = [[] for _ in range(n + 1)]
for _ in range(m):
a, b, p = map(int, input().split())
graph[a].append((b, p))
start, end = map(int, input().split())
def dijkstra(start):
INF = float('inf')
distance = [INF] * (n + 1)
distance[start] = 0
pq = [(0, start)]
while pq:
cost, node = heapq.heappop(pq)
if distance[node] < cost:
continue
for next_node, price in graph[node]:
new_cost = cost + price
if new_cost < distance[next_node]:
distance[next_node] = new_cost
heapq.heappush(pq, (new_cost, next_node))
return distance
min_cost = dijkstra(start)[end]
print(min_cost)
'알고리즘' 카테고리의 다른 글
| [알고리즘|파이썬] 백준 2012 등수 매기기 (0) | 2025.02.19 |
|---|---|
| [알고리즘|파이썬] 백준 4803 트리 (0) | 2025.02.18 |
| [알고리즘|파이썬] 백준 18352 특정 거리의 도시 찾기 (0) | 2025.02.16 |
| [알고리즘|파이썬] 백준 2116 주사위 쌓기 (1) | 2025.02.14 |
| [알고리즘|파이썬] 백준 1713 후보 추천하기 (0) | 2025.02.13 |