프로그래머스 그리디 문제

1 minute read

크루스칼 알고리즘

  • 크루스칼 알고리즘은 모든 정점을 가장 짧은 거리내에 방문하고 싶을 때 사용되는 알고리즘이다.
def solution(n, costs):
    total = 0
    uni = [i for i in range(n+1)]
    costs.sort(key=lambda x: x[-1])
    print(costs)
    
    def find(x):
        if x == uni[x]:
            return x
        else:
            uni[x] = find(uni[x])
            return find(uni[x])
    
    def union(x, y):
        # a는 x의 부모 노드
        a = uni[x]
        
        # b는 y의 부모 노드
        b = uni[y]
        
        # a의 부모 노드를 b로 설정함 (즉, 두 개의 부모 노드를 같게 설정함)
        if a != b:
            uni[a] = b
    
    for cost in costs:
        v, w, c = cost
        # v의 부모 노드와 w의 부모 노드가 다를시에 union을 통해 부모 노드를 같게 만듬
        if find(v) != find(w):
            union(v, w)
            total += c
    
    return total
  • 크루스칼 알고리즘은 union & find 방식을 통해 풀 수 있다.

다익스트라 알고리즘

  • 다음과 같은 그래프가 주어지고 시작점에서 다른 노드까지의 가장 가까운 거리를 구하는 것이 다익스트라 알고리즘이다.
graph = {
    'A': {'B': 8, 'C': 1, 'D': 2},
    'B': {},
    'C': {'B': 5, 'D': 2},
    'D': {'E': 3, 'F': 5},
    'E': {'F': 1},
    'F': {'A': 5}
}

솔루션은 다음과 같다:

import heapq

def dijkstra(graph, start):
  # 시작점부터 각 노드까지의 거리를 무한대로 초기화함
  distances = {node: float('inf') for node in graph}
  queue = []
  distances[start] = 0
  heapq.heappush(queue, [start, distances[start]])
  
  while queue:
  # 현재 노드에서 가장 가까운 위치에 있는 노드를 선택함
    current_des, current_dis = heapq.heappop(queue)
  
  # 기존에 있는 길이보다 길다면, 볼 필요도 없음
    if distances[current_des] < current_dis:
      continue
  
  # next_dis는 현재 노드에서 가장 가까운 노드가 가리키고 있는 다른 노드까지의 거리
    for next_des, next_dis in graph[current_des].items():
      distance = current_dis + next_dis
      if distance < distances[next_des]:
        distances[next_des] = distance
        heapq.heappush(queue, [next_des, distance])
        
  return distances

Comments