일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 2981
- javascript
- BFS
- 소수
- Dijkstra
- spring security
- Spring
- 코딩테스트
- 최단경로
- 탐욕법
- beandefinitionstoreexception
- java
- 라이브템플릿
- 백준
- 프로그래머스
- algorithm
- springboot
- applicationeventpublisher
- API
- error
- 알고리즘
- codility
- Python
- HTTP
- 2018 KAKAO BLIND RECRUITMENT
- counting elements
- Greedy
- 문자열
- 파이썬
- brute force
Archives
- Today
- Total
Altiora Petamus
미확인 도착지 본문
🤔생각해보기
문제의 조건은 잘 읽어보면 간단하다.
- start → g → h → 목적지
- start → h → g → 목적지
다익스트라 알고리즘을 활용하여 위 두 경로의 길이가 start → 목적지 의 최단 경로와 같은게 있다면 출력한다.
👨🏻💻코드
import sys
import heapq
def dijkstra(start):
dist = {i: float('inf') if i != start else 0 for i in range(1, n + 1)}
heap = [(0, start)]
while heap:
cur_dist, cur_node = heapq.heappop(heap)
if dist[cur_node] < cur_dist:
continue
for next_node, d in nodes[cur_node]:
new_d = cur_dist + d
if dist[next_node] > new_d:
dist[next_node] = new_d
heapq.heappush(heap, (new_d, next_node))
return dist
T = int(sys.stdin.readline())
for _ in range(T):
n, m, t = map(int, sys.stdin.readline().split())
s, g, h = map(int, sys.stdin.readline().split())
nodes = {}
candidates = []
for _ in range(m):
a, b, d = map(int, sys.stdin.readline().split())
nodes[a] = nodes.get(a, []) + [(b, d)]
nodes[b] = nodes.get(b, []) + [(a, d)]
for _ in range(t):
x = int(sys.stdin.readline())
candidates.append(x)
# g h 를 지나서 가는 길이 스타트 지점부터 두개의 목적지까지 가는 최소 경로와 같다면 정답에 포함
result = []
s_ = dijkstra(s)
g_ = dijkstra(g)
h_ = dijkstra(h)
answer = []
# 중간 경로
for goal in candidates:
sh1 = s_[h] + h_[g] + g_[goal]
sg1 = s_[g] + g_[h] + h_[goal]
if sh1 != float('inf') or sg1 != float('inf'): # 목적지에 도달할 수 없는 경우 제외
if sh1 == s_[goal] or sg1 == s_[goal]:
answer.append(goal)
answer.sort()
print(*answer)
목적지에 도달할 수 없는 경우를 걸러냈어야하는데 그 부분을 미쳐 생각하지 못해서 시간이 좀 걸렸다.
이런 문제를 풀 때는 도달할 수 없는 예외 케이스를 꼼꼼하게 체크해보자.
'1day-1algorithm' 카테고리의 다른 글
방금그곡 (0) | 2021.08.09 |
---|---|
특정한 최단 경로 (0) | 2021.07.27 |
다트 게임 (0) | 2021.07.17 |
추석 트래픽 (0) | 2021.07.08 |
벽 부수고 이동하기 (0) | 2021.07.05 |