Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        250x250
    
    
  | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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
                            
                        
                          
                          - bfs
 - softeer
 - Lv. 1
 - Lv. 3
 - Dynamic Programming
 - 동적계획법
 - 자바스크립트
 - programmers
 - 오블완
 - level 3
 - Python
 - 소프티어
 - 파이썬
 - DP
 - javascript
 - 프로그래머스
 - 깊이 우선 탐색
 - SQL
 - Lv. 2
 - LEVEL 2
 - Baekjoon
 - Java
 - dfs
 - 너비 우선 탐색
 - 백준
 - group by
 - join
 - 티스토리챌린지
 - Lv. 0
 - SQL 고득점 KIT
 
                            Archives
                            
                        
                          
                          - Today
 
- Total
 
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 3] 섬 연결하기 {언어 : Python} [프림 알고리즘, 다시 풀어 보기] 본문
728x90
    
    
  문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42861?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답 코드
import heapq
def solution(n, costs):
    adjL = [[] for _ in range(n)]
    for start, to, cost in costs:
        adjL[start].append((cost, to))
        adjL[to].append((cost, start))
    
    visited = [False] * n
    min_heap = [(0, 0)]  # (cost, node)
    total_cost = 0
    edges_used = 0
    while min_heap and edges_used < n:
        cost, node = heapq.heappop(min_heap)
        if visited[node]:
            continue
        
        visited[node] = True
        total_cost += cost
        edges_used += 1
        
        for next_cost, next_node in adjL[node]:
            if not visited[next_node]:
                heapq.heappush(min_heap, (next_cost, next_node))
    return total_cost
풀이 방법
- 인접 리스트 생성: 주어진 간선 정보를 기반으로 인접 리스트(adjL)를 생성한다.
 - 우선순위 큐(최소 힙) 초기화: 시작 노드(0)와 비용(0)을 최소 힙에 추가한다.
 - 프림 알고리즘 수행:
- 최소 힙에서 비용이 가장 작은 노드를 꺼낸다.
 - 해당 노드를 방문하지 않았다면 방문 처리하고, 총 비용에 해당 간선 비용을 더한다.
 - 방문한 노드와 연결된 모든 간선 중 방문하지 않은 노드로의 간선을 최소 힙에 추가한다.
 
 - 최소 신장 트리의 총 비용 반환: 모든 노드를 방문할 때까지 과정을 반복하며 최종적으로 최소 신장 트리의 총 비용을 반환하면 끝!
 
느낀점
- 최소 신장 트리(MST)에는 프림, 크루스칼이 있다.
 - 다시 풀어보는게 좋을 것 같다.
 
728x90
    
    
  '알고리즘 > 다시 풀어 보기' 카테고리의 다른 글
| 프로그래머스 [Lv. 3] 경주로 건설 {언어 : JavaScript} [다시 풀어 보기] (0) | 2024.06.24 | 
|---|---|
| 프로그래머스 [Lv. 3] 디스크 컨트롤러 {언어 : Python} [다시 풀어 보기] (1) | 2024.06.20 | 
| 프로그래머스 [Lv. 3] 양과 늑대 {언어 : Python} [다시 풀어 보기] (0) | 2024.05.27 | 
| 프로그래머스 [Lv. 3] 표 편집 {언어 : Java} [다시 풀어 보기] (0) | 2024.05.24 | 
| 프로그래머스 [Lv. 2] 다음 큰 숫자 {언어 : JavaScript} [다시 풀어 보기] (0) | 2024.05.21 |