출처 : 백준, https://www.acmicpc.net/problem/11404
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
# n개의 도시 사이를 운행하는 m개의 버스가 있음
# A B C -> A 도시에서 B 도시로 가는 비용 C
# 가격이 다른 동일 노선이 존재할 수 있음.
# 각 도시에서 다른 도시로 가는 최소 비용을 출력
# 갈 수 없을 경우 0 출력
더보기
먼저, 생각해야 할 부분
1. 가격이 다른 동일 노선이 존재할 수 있다.
2. 모든 도시에서 모든 도시로 가는 최소 비용을 구해야한다. -> 플로이드-워셜 알고리즘
3. 갈 수 없을 경우 0을 출력해야한다.
4. 반복문을 통해 많은 입력을 받을 때, input() 함수는 느리다.
시간 초과가 난다면 input() 함수를 사용한건 아닌지 고려해보자.
풀이
import sys
INF = float('inf')
def solution(n, cost_matrix):
for k in range(n):
for i in range(n):
if i == k:
continue
for j in range(n):
if i == j or j == k:
continue
prev_val = cost_matrix[i][j]
next_val = cost_matrix[i][k] + cost_matrix[k][j]
cost_matrix[i][j] = min(prev_val, next_val)
for line in cost_matrix:
for num in line:
print(num if num != INF else 0, end=' ')
print()
n = int(input())
bus = int(input())
cost_matrix = [[INF for j in range(n)] for i in range(n)]
for _ in range(bus):
A, B, cost = map(int, sys.stdin.readline().rstrip().split())
cost_matrix[A - 1][B - 1] = min(cost, cost_matrix[A - 1][B - 1])
solution(n, cost_matrix)
시간 복잡도
O(N^3)
알게 된 점
플로이드-워셜 알고리즘
모든 점으로부터 모든 점으로의 최단 거리를 구할 때는 플로이드-워셜 알고리즘을 사용한다.
Github
GitHub - bh2980/Algorithm-Problem: 알고리즘 풀이 흔적들
알고리즘 풀이 흔적들. Contribute to bh2980/Algorithm-Problem development by creating an account on GitHub.
github.com
'알고리즘 > Python' 카테고리의 다른 글
[python] 이코테 - 화성 탐사 (0) | 2023.04.13 |
---|---|
[python] 이코테 - 정확한 순위 (0) | 2023.04.13 |
[python] 프로그래머스 - 연속된 부분 수열의 합 (0) | 2023.04.13 |
[python] 백준 14890 - 경사로 (0) | 2023.04.07 |
[python] 백준 20056 - 마법사 상어와 파이어볼 (0) | 2023.04.07 |