일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 2004 #조합 0의 개수 #백준
- 다익스트라 #알고리즘 #bfs #그리디 #다이나믹프로그래밍 #leetcode #python
- 코틀린 #Do it #깡샘 #안드로이드
- dfs #bfs #트리구조 #이진트리 #leetcode #파이썬 #python
- 아스테리스크 #Asterisk #파이썬
- final #java #자바 #안드로이드
- 다익스트라 #dijkstra #leetcode #파이썬 #python #algorithm #787
- dfs #leetcode #python #graph #그래프
- 해시테이블 #heapq #파이썬 #리트코드 #알고리즘
- dfs #python #leetcode
- exoplayer #mediaplayer #엑소플레이어 #안드로이드 #android
- context #android #getApplicationContext #activity #생명주기 #lifecycle
- leetcode #python #dfs #재귀
- AsyncTask #doinbackground #스레드 #thread #android #안드로이드
- Python #leetcode #dfs #그래프 #백트래킹
- dfs #그래프 #graph #python #leetcode #course #schedule
- leetcode #subsets #dfs #itertools #python
- dfs #bfs #트리구조 #이진트리 #leetcode #python #파이썬
- gcd #최대공약수 #백준 #2981 #검문
- 리트코드 #팰린드롬 #파이썬
- dfs #bfs #leetcode #python
- python #백준 #2580 #스도쿠 #dfs #백트래킹
- 백준 #파이썬 #bfs #백트래킹 #1697 #숨바꼭질
- dfs #bfs #이진트리 #파이썬 #리트코드
- dfs #python #leetcode #combination
- dfs #leetcode #python
- 파이썬 #zip
- handler #looper #thread #runnable #핸들러 #루퍼 #스레드 #러너블
- dfs #이진트리 #트리구조 #직렬화 #역직렬화 #파이썬 #리트코드 #leetcode #python
- python #백준 #9375 #패션왕 #신해빈
- Today
- Total
멋진 개발자가 되고 싶다
[LeetCode/Python] 743. 네트워크 딜레이 타임(Network Delay Time) (feat.다익스트라 알고리즘) 본문
[LeetCode/Python] 743. 네트워크 딜레이 타임(Network Delay Time) (feat.다익스트라 알고리즘)
오패산개구리 2021. 7. 29. 16:31
K부터 출발해 모든 노드가 신호를 받을 수 있는 시간을 계산하라.
불가능할 경우 -1을 리턴한다.
입력값 (u, v, w)는 각각 출발지, 도착지, 소요 시간으로 구성되며, 전체 노드의 개수는 N으로 입력받는다.
example:
Input: times = [[2,1,1], [2,3,1], [3,4,1]], n = 4, k = 2
Output: 2
** 깔끔한 풀이
1. 다익스트라 알고리즘 구현
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
|
class Solution:
def networkDelayTime(self, times, n: int, k: int) -> int:
graph = collections.defaultdict(list)
# 그래프 인접 리스트 구성
for u,v,w in times:
graph[u].append((v,w))
# 큐 변수: [(소요 시간, 정점)]
Q = [(0, k)]
dist = collections.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:
return max(dist.values())
return -1
|
cs |
해설:
다익스트라 알고리즘을 우선 이해해야 한다.
https://m.blog.naver.com/ndb796/221234424646
C++로 되어있긴 한데 개념을 잡는데는 부족함이 없다.
우선순위 큐로 구현하여 시간 복잡도를 낮출 수 있다.
우선순위 큐를 사용하지 않는다면 dist 값을 모든 경로마다 경신해야 돼서 오래 걸림;;
Q를 heapq로 구현하여 최소 힙을 빼서 dist를 구해나간다.
만약 dist에 node가 이미 존재한다면
dist에 들어있는 것이 최소 시간이므로 건들지 말고 넘어간다.
이렇게 dist를 구하고 나면 문제 특성상 dist에 모든 정점의 소요 시간이 들어있어야 하므로
len(dist) == n으로 확인을 해주고
그 후 최댓값을 리턴해주자.
2. 내가 직접 짠 코드
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
|
class Solution:
def networkDelayTime(self, times, n: int, k: int) -> int:
grid = [[sys.maxsize] * n for _ in range(n)]
for time in times:
grid[time[0] - 1][time[1] - 1] = time[2]
for i in range(n):
grid[i][i] = 0
# k에서 출발
ver_time = grid[k - 1].copy()
# 각 정점을 지나면서 소요 시간 계산
visited = [k - 1]
for _ in range(n - 1):
# 가장 최소 거리를 갖는 정점 반환
min = sys.maxsize
index = sys.maxsize
for i in range(n):
if ver_time[i] < min and i not in visited:
min = ver_time[i]
index = i
if index == sys.maxsize:
return -1
visited.append(index)
for i in range(n):
if ver_time[i] > ver_time[index] + grid[index][i] and index != i:
ver_time[i] = ver_time[index] + grid[index][i]
return max(ver_time)
|
cs |
해설:
나름대로 우선순위 큐를 사용하지 않고 다익스트라 알고리즘을 이용하여 풀어봤다.
이 문제만 그런건진 모르겠는데 시간 복잡도 또한 1번 코드랑 다를 바가 없었다..!
grid에 노드 간 소요시간을 넣어줬고
k에서 출발하여 소요 시간이 적은 곳부터 이동하면서 소요 시간을 갱신해주었다.
'Algorithm Study > leetcode' 카테고리의 다른 글
[LeetCode/Python] 104. 이진 트리의 최대 깊이(Maximum Depth of Binary Tree) (0) | 2021.08.07 |
---|---|
[LeetCode/Python] 787. Cheapest Flights Within K Stops (0) | 2021.08.01 |
[LeetCode/Python] 207. 코스 스케줄(Course Schedule) (0) | 2021.07.29 |
[LeetCode/Python] 332. 일정 재구성(Reconstruct Itinerary) (0) | 2021.07.29 |
[LeetCode/Python] 39. 조합의 합(Combination Sum) (0) | 2021.07.28 |