Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 1차원 DP
- 2차원 dp
- 99클럽
- @GeneratedValue
- @GenericGenerator
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
- Collections
- Combination
- combinations
- Comparator
Archives
- Today
- Total
기록
프로그래머스_python_섬 연결하기 본문
문제
https://programmers.co.kr/learn/courses/30/lessons/42861
풀이
신장트리
모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프
최소신장트리
최소한의 비용으로 만들수 있는 신장트리
크루스칼 알고리즘
1. 간선을 비용이 적은 것부터 오름차순으로 정렬한다.
2. 각 간선이 사이클을 발생시키는지 확인한다.
2-1. 사이클을 발생시키지 않는다면 신장 트리에 포함한다.
2-2. 사이클을 발생시키지 않는다면 신장 트리에 포함하지 않는다.
풀이
전체적인 틀은 dfs & bfs 와 같다.
- graph에 연결된 노드와 가중치를 저장한다.
- graph = {0: [(1, 1), (2, 2)], 1: [(1, 0), (5, 2), (1, 3)], 2: [(2, 0), (5, 1), (8, 3)], 3: [(1, 1), (8, 2)]}
- 모든 노드를 지날 때까지 탐색한다.
- 처음 노드는 0
- heapq를 사용하여, 비용이 가장 작은 노드를 꺼낸다.
- 지나간 노드는 다시 방문하지 못하도록 해서 사이클의 발생을 막는다.
코드
import heapq
NOTPASSED = -1
def solution(N, costs):
# save connection to graph
graph = {i:list() for i in range(N)}
for n, m, w in costs :
graph[n].append((w, m))
graph[m].append((w, n))
# search
passed = [NOTPASSED for i in range(N)] # save weight
heap = [(0, 0)]
while heap :
w, n = heapq.heappop(heap)
if passed[n]==NOTPASSED : # 지나간 적 없는 노드만을 탐색
# save weight
passed[n] = w
# add next node
for nw, cnode in graph[n] :
if passed[cnode]==NOTPASSED : # 지나간 적 없는 노드만을 탐색
heapq.heappush(heap, (nw, cnode))
return sum(passed)
비슷한 문제
'코딩테스트 > python' 카테고리의 다른 글
프로그래머스_python_올바른 괄호의 갯수 (0) | 2022.01.06 |
---|---|
프로그래머스_python_최적의 행렬 곱셈 (0) | 2021.12.29 |
프로그래머스_python_배달 (0) | 2021.12.27 |
프로그래머스_python_모두 0으로 만들기 (0) | 2021.12.26 |
프로그래머스_경주로 건설 (0) | 2021.12.26 |
Comments