↓↓↓ 아래는 내 리트코드 계정 ↓↓↓
문제 설명
You are given a network of n nodes, labeled from 1 to n. You are also given times, a list of travel times as directed edges times[i] = (ui, vi, wi), where ui is the source node, vi is the target node, and wi is the time it takes for a signal to travel from source to target.
We will send a signal from a given node k. Return the time it takes for all the n nodes to receive the signal. If it is impossible for all the n nodes to receive the signal, return -1.
입출력 예
Example 1:
Input: times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2 Output: 2
Example 2:
Input: times = [[1,2,1]], n = 2, k = 1 Output: 1
Example 3:
Input: times = [[1,2,1]], n = 2, k = 2 Output: -1
Constraints
- 1 <= k <= n <= 100
- 1 <= times.length <= 6000
- times[i].length == 3
- 1 <= ui, vi <= n
- ui != vi
- 0 <= wi <= 100
- All the pairs (ui, vi) are unique. (i.e., no multiple edges.)
Code
def networkDelayTime(self, times, N, K):
graph = collection.defaultdict(list) # 인접 리스트로 만들어주기
# times = [[2, 1, 1], [2, 3, 1], [3, 4,1]], N = 4, K = 2
for u, v, w in times:
graph[u].append((v, w)) # 시작점 인덱스에 도착점, 정점 간 거리 append
Q = [(0, K)] # (소요 시간, 정점) # 시작점
dist = collection.defaultdict(int) # 구조만 만들어두기
# 최단 경로 찾기
while Q:
time, node = heapq.heappop(Q)
if node not in dist:
dist[node] = time
for v, w in graph[node]:
alt = time + w
heapq.heappush(Q, (alt, v))
# 모든 노드에 도달할 수 있는지 찾기
if len(dist) == N: # dist의 키 개수가 N(전체 노드 개수)과 동일한지
return max(dist.values())
return -1
이 문제에서는 다익스트라 알고리즘을 활용해 모든 노드가 신호를 받는데까지 걸리는 시간과 모든 노드가 신호를 받을 수 있는지를 판별해야 한다. 우선, 입력값으로 받은 time의 시작점, 도착점, 소요 시간을 graph라는 dictionary에 저장한 후 (defaultdict 사용), heapq 모듈을 사용해 최단 경로를 찾는다. 초기화 한 dist 딕셔너리에 node와 time을 하나씩 추가하며 (맨 처음은 시작점 2, 소요시간 0), graph에 할당한 정보들을 활용해 Q에 계속적으로 노드와 소요 .시간 정보를 추가한다. 마지막으로 문제의 조건에 의해 '모든 노드에 도달할 수 있는지' 에 대한 코드를 추가한다. 전체 노드의 개수 N과 dist의 길이가 같지 않으면 모든 노드를 돌 수 없는 것이므로 -1를 return한다.
I'm a Senior Student in Data Science !
데이터 사이언스를 공부하고 있는 학부생의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 :)
'Programming > #Algorithm' 카테고리의 다른 글
[알고리즘] Leetcode #104 이진 트리의 최대 깊이 (Python) (0) | 2021.05.12 |
---|---|
[알고리즘] Leetcode #787 K 경유지 내 가장 저렴한 항공권 (Python) (0) | 2021.05.11 |
[알고리즘] Leetcode #15 세 수의 합 (Python) (0) | 2021.02.13 |
[알고리즘] Leetcode #49 그룹 애너그램 (Python) (0) | 2021.02.12 |
[알고리즘] Leetcode #125 유효한 팰린드롬 (Python) (0) | 2021.02.11 |