개발/algorithm

[프로그래머스][level3] 등산 코스 정하기 - Python

zzi_on2 2023. 1. 17. 14:22

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/118669

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이 

- 다익스트라 알고리즘 응용 

여기서는 도착 위치까지 가장 짧은 거리를 구하는 것이 아니라, intensity가 가장 짧은 것을 구해야 하므로

기존 다익스트라 알고리즘의 distance 배열에 intensity의 최솟값으로 갱신해주면 된다. 

import heapq 

def dijkstra(n, graph, gates, summits ):
    heap = []
    
    # intensity가 같다면, 산봉우리의 번호가 가장 낮아야 하므로 
    summits.sort()
    # intensity 저장 
    distance = [int(1e9)] * (n+1)
	
    # 출입구 힙에 넣어주기 
    for g in gates:
        distance[g] = 0 
        heapq.heappush(heap, (0, g))

    while heap :
        dist, now = heapq.heappop(heap)
		
        # 이미 더 짧은 intensity를 지나왔거나, 산봉우리에 도착했으면 
        if distance[now] < dist or now in summits :
            continue 
    	
        for i in graph[now]:
        	# intensity 구하기 
            cost = max(i[1], dist)
			
            # intensity 갱신 
            if cost < distance[i[0]] : 
                distance[i[0]] = cost 
                heapq.heappush(heap, (cost, i[0]))
	
    result = int(1e9)   
    num = 0 
    # intensity가 가장 작은 등산 코스 구하기 
    for s in summits:  
        if distance[s] < result :
            result = distance[s]
            num = s 

    return [num, result]

def solution(n, paths, gates, summits):
    graph = [ [] for _ in range(n+1)]

    for a,b,c in paths:
        graph[a].append((b,c))
        graph[b].append((a,c))

    return dijkstra(n, graph, gates, summits)