섬 연결하기
문제분석
섬들 사이에 다리를 놓을 때 드는 비용 정보들이 주어졌을 때, 모든 섬을 연결하는데 드는 최소 비용을 구하는 문제이다.
모든 점을 연결하는데 드는 최소 비용임으로, 탐색을 어느 점에서 시작하는지에 영향을 받지 않는다.
- 간선 정보는 dictionary를 사용해 저장했다.
- 가장 건설 비용이 적은 간선부터 건설해나가기 위해서 heapq를 사용했다.
- check리스트에 섬 방문 정보를 저장했다.
- DFS를 이용해 건설 비용이 작은 간선부터 첫 방문인 섬들에 대해서만 탐색해 나간다.
CODE
def solution(n, costs):
#섬들 간의 다리 건설 비용 정보를 dictionary에 저장
bridge = dict()
for a, b, c in costs:
if a in bridge:
bridge[a].append((b, c))
else:
bridge[a] = [(b, c)]
if b in bridge:
bridge[b].append((a, c))
else:
bridge[b] = [(a, c)]
import heapq as hq
def short(x):
shortest = 0
# 섬 방문여부
check = list(True for _ in range(n))
point = [[0, x]]
# 길이가 가장 짧은 간선부터 탐색해 나가기 위해서 heapq사용
hq.heapify(point)
while point:
dist, a = hq.heappop(point)
# 해당 점을 아직 탐색하지 않은 경우에만 탐색한다.
if check[a] == True:
check[a] = False
shortest += dist
if a in bridge:
for i, w in bridge[a]:
if check[i]:
hq.heappush(point, [w, i])
return shortest
# 모든 점이 최단거리로 연결되어야 하기 때문에 어떤 점에서 시작하더라도 같은 값이 나와야 한다.
answer = short(0)
return answer
틀린 부분이 있을 수 있습니다. 피드백 주시면 고치도록 하겠습니다! 감사합니다.👍
[꼭 다시 풀어보기]