[Python] 프로그래머스 / Level3 / 가장 먼 노드

김상우·2021년 9월 23일
0

📌 문제 링크

최단거리 알고리즘

다음은 대표적인 최단거리 알고리즘 2개이다.

  • 다익스트라 알고리즘 (Dijkstra)
  • 플로이드 워셜 알고리즘 (Floyd-Warshall)

잘못된 풀이 : 플로이드 워셜

처음엔 아무생각 없이, 다익스트라보다 플로이드 워셜 알고리즘이 더 사용하기 편했기 때문에 플로이드 워셜 알고리즘으로 문제를 풀었다. ***
def solution(n, edges):
    answer = 0; INF = 99999
    graph = [ [] for _ in range(n+1) ]
    
    for edge in edges:
        node1, node2 = edge[0], edge[1]
        graph[node1].append(node2)
        graph[node2].append(node1)
    
    distance = [ [INF] * (n+1) for _ in range(n+1) ]
    
    for i in range(n+1): distance[i][i] = 0
    
    for i in range(n+1):
        nodes = graph[i]
        for node in nodes:
            distance[i][node] = 1
        
    for k in range(1,n+1):
        for a in range(1,n+1):
            for b in range(1,n+1):
                distance[a][b] = min(distance[a][b], distance[a][k]+distance[k][b])

    return distance[1][1::].count(max(distance[1][1::]))

잘못된 결과

정확도 테스트는 통과했지만, 효율성 테스트를 통과하지 못했다.

그때 든 생각 : 앗, 이런 내가 문제 조건을 제대로 안 봤구나.

다시 제한사항에게 관심을 주었다. 역시 ,, N 조건이 10^4 (1만) 을 넘어갔다.

플로이드 워셜 알고리즘의 시간 복잡도는 O(N^3) time 이기 때문에 효율성 테스트를 통과 못하는 것은 당연하다.

(보통 10^9 이상의 연산 횟수를 가지면 효율성 테스트를 통과하지 못한다)

O(N^2)의 복잡도를 가지는 다익스트라 알고리즘을 사용했어야 한다.

올바른 풀이 : 다익스트라

import heapq
def solution(n, edges):
    answer = 0; INF = 99999
    graph = [ [] for _ in range(n+1) ]
    distance = [INF] * (n+1)
    distance[1] = 0
    
    for edge in edges:
        node1, node2 = edge[0], edge[1]
        graph[node1].append(node2)
        graph[node2].append(node1)
        
    # dijkstra
    q = []
    heapq.heappush(q,(0,1))
    while q:
        dist, now = heapq.heappop(q)
        if distance[now] < dist : continue
        
        for v in graph[now]:
            cost = dist + 1
            if cost < distance[v] : 
                distance[v] = cost
                heapq.heappush(q,(cost,v))
            
    return distance.count(max(distance[1:]))

올바른 결과


정확성 + 효율성 통과 성공
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글