본문 바로가기
Algorithm/Python

프로그래머스 부대복귀

by Shark_상어 2023. 1. 29.
728x90

문제

문제링크

문제 설명

강철부대의 각 부대원이 여러 지역에 뿔뿔이 흩어져 특수 임무를 수행 중입니다. 지도에서 강철부대가 위치한 지역을 포함한 각 지역은 유일한 번호로 구분되며, 두 지역 간의 길을 통과하는 데 걸리는 시간은 모두 1로 동일합니다. 임무를 수행한 각 부대원은 지도 정보를 이용하여 최단시간에 부대로 복귀하고자 합니다. 다만 적군의 방해로 인해, 임무의 시작 때와 다르게 되돌아오는 경로가 없어져 복귀가 불가능한 부대원도 있을 수 있습니다.

강철부대가 위치한 지역을 포함한 총지역의 수 n, 두 지역을 왕복할 수 있는 길 정보를 담은 2차원 정수 배열 roads, 각 부대원이 위치한 서로 다른 지역들을 나타내는 정수 배열 sources, 강철부대의 지역 destination이 주어졌을 때, 주어진 sources의 원소 순서대로 강철부대로 복귀할 수 있는 최단시간을 담은 배열을 return하는 solution 함수를 완성해주세요. 복귀가 불가능한 경우 해당 부대원의 최단시간은 -1입니다.

제한사항
  • 3 ≤ n ≤ 100,000
    • 각 지역은 정수 1부터 n까지의 번호로 구분됩니다.
  • 2 ≤ roads의 길이 ≤ 500,000
    • roads의 원소의 길이 = 2
    • roads의 원소는 [a, b] 형태로 두 지역 a, b가 서로 왕복할 수 있음을 의미합니다.(1 ≤ a, b ≤ n, a ≠ b)
    • 동일한 정보가 중복해서 주어지지 않습니다.
      • 동일한 [a, b]가 중복해서 주어지지 않습니다.
      • [a, b]가 있다면 [b, a]는 주어지지 않습니다.
  • 1 ≤ sources의 길이 ≤ 500
    • 1 ≤ sources[i] ≤ n
  • 1 ≤ destination ≤ n
 

입출력 예

n          roads                                                                                               sources                  destination  result
3 [[1, 2], [2, 3]] [2, 3] 1 [1, 2]
5 [[1, 2], [1, 4], [2, 4], [2, 5], [4, 5]] [1, 3, 5] 5 [2, -1, 0]

입출력 예 설명

입출력 예 #1

  • 지역 2는 지역 1과 길로 연결되어 있기 때문에, 지역 2에서 지역 1의 최단거리는 1입니다.
  • 지역 3에서 지역 1로 이동할 수 있는 최단경로는 지역 3 → 지역 2 → 지역 1 순으로 이동하는 것이기 때문에, 지역 3에서 지역 1의 최단거리는 2입니다.
  • 따라서 [1, 2]를 return합니다.

입출력 예 #2

  • 지역 1에서 지역 5의 최단경로는 지역 1 → 지역 2 → 지역 5 또는 지역 1 → 지역 4 → 지역 5 순으로 이동하는 것이기 때문에, 최단거리는 2입니다.
  • 지역 3에서 지역 5로 가는 경로가 없기 때문에, 지역 3에서 지역 5로 가는 최단거리는 -1입니다.
  • 지역 5에서 지역 5는 이동할 필요가 없기 때문에, 최단거리는 0입니다.
  • 따라서 [2, -1, 0]을 return합니다.

2. 코드

import sys
from heapq import heappush, heappop

INF = sys.maxsize

def solution(n, roads, sources, destination):
    ans = []
    maps = [[] for _ in range(n + 1)]
    
    for a, b in roads:
        maps[a].append((b, 1))
        maps[b].append((a, 1))
    
    q = []
    heappush(q, (0, destination))
    dis = [INF] * (n + 1)
    dis[destination] = 0
    
    while q:
        dist, now = heappop(q)
        
        if dis[now] < dist:
            continue
        
        for i in maps[now]:
            cost = dist + i[1]
            
            if cost < dis[i[0]]:
                dis[i[0]] = cost
                heappush(q, (cost, i[0]))
    for i in sources:
        if dis[i] == INF:
            ans.append(-1)
        else:
            ans.append(dis[i])
    return ans

3. 회고

Q. 문제를 보고 든 생각

  • 일반적인 다익스트라 문제인걸 파악했다.
  • 또한 출발지에서 목적지를 갈수 있느냐를 구하는거보단 목적지에서 출발지로 되돌아 갈수 있는지를 물어보는 살짝 꼬아놓은 문제 라고 생각이 들었다.
  • 목적지에서 다익스트라 를 돌린후 sources에 대해 도착가능한지 아닌지 파악하여 답변을 제출하면되는 문제이다.

4. 고쳐야 할점

문제를 보자마자 바로 파악 하는 능력을 조금 더 길렀으면 좋겠다.

728x90

'Algorithm > Python' 카테고리의 다른 글

백준 12834번 주간 미팅  (0) 2023.02.01
백준 1202번 보석도둑  (0) 2023.02.01
백준 2307번 도로검문  (1) 2023.01.26
백준 1486번 등산  (0) 2023.01.24
백준 22255번 호석사우루스  (0) 2023.01.24