티스토리 뷰
📌문제
어떤 나라에 N개의 도시가 있다. 그리고 각 도시는 보내고자하는 메세지가 있는 경우, 다른 도시로 전보를 보내서 다른 도시로 해당 메세지를 전송할 수 있다. 하지만 X라는 도시에서 Y라는 도시로 전보를 보내고자 한다면 그 사이 통로가 있어야 한다.
어느날 C라는 도시에서 위급 상황이 발생했다. 그래서 최대한 많은 도시로 메세지를 보내고자 한다. 메세지는 도시 C에서 출발하여 각 도시 사이 설치된 통로를 거쳐 최대한 많이 퍼져나갈 것이다. 각 도시의 번호와 통로가 설치되어 있는 정보가 주어졌을 때, 도시 C에서 보낸 베세지를 받게 되는 도시의 개수는 총 몇개이며 도시들이 모두 메세지를 받는 데까지 걸리는 시간을 계산하시오.
📌풀이
한 도시에서 다른 도시까지의 최단 거리 문제
우선 순위 큐를 이용한 다익스트라 알고리즘 사용
📌코드
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9) # 무한, 10억
# 노드의 개수, 간선의 개수, 시작 노드 입력
n, m, start = map(int, input().split())
# 각 노드에 연결되어 있는 노드에 대한 정보 담는 리스트
graph = [[] for i in range(n + 1)]
# 최단 거리 테이블 무한으로 초기화
distance = [INF] * (n + 1)
# 모든 간선 정보 입력
for _ in range(m):
x, y, z = map(int, input().split())
# x노드에서 y노드로 가는 비용 z
graph[x].append((y, z))
def dijkstra(start):
q = []
# 시작 노드로 가기 위한 최단 경로는 0으로 설정, 큐에 삽입
heapq.heappush(q, (0, start))
distance[start] = 0
while q: # 큐가 비어있지 않으면
# 가장 최단 거리가 짧은 노드에 대한 정보 꺼내기
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
# 현재 노드와 연결된 인접 노드 확인
for i in graph[now]:
cost = dist + i[1]
# 현재 노드를 거쳐서 다른 노드를 이동하는 거리가 더 짧은 경우
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
dijkstra(start)
count = 0 # 도달할 수 있는 노드 개수
max_distance = 0 # 도달할 수 있는 노드 중, 가장 멀리 있는 노드와의 최단 거리
for d in distance:
# 도달할 수 있는 노드인 경우
if d != INF:
count += 1
max_distance = max(max_distance, d)
print(count - 1, max_distance) # 시작 노드 제외(-1)
📌참고
이것이 취업을 위한 코딩 테스트다 with 파이썬
IT 취준생이라면 누구나 입사하고 싶은 카카오・삼성전자・네이버・라인!취업의 성공 열쇠는 알고리즘 인터뷰에 있다! IT 취준생이라면 누구나 가고 싶어 하는 카카오, 라인, 삼성전자의 2016년
www.google.com
'코딩테스트' 카테고리의 다른 글
서로소 집합을 활용한 사이클 판별 (1) | 2024.11.10 |
---|---|
그래프, 서로소 집합 (1) | 2024.11.08 |
미래 도시 (3) | 2024.11.06 |
최단 경로, 플로이드 워셜 알고리즘 (1) | 2024.11.05 |
최단 경로, 개선된 다익스트라 알고리즘 (1) | 2024.11.04 |