-
[프로그래머스] 부대복귀 C++Coding Test/programmers 2023. 9. 15. 12:36728x90
문제 설명
강철부대의 각 부대원이 여러 지역에 뿔뿔이 흩어져 특수 임무를 수행 중입니다. 지도에서 강철부대가 위치한 지역을 포함한 각 지역은 유일한 번호로 구분되며, 두 지역 간의 길을 통과하는 데 걸리는 시간은 모두 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] 풀이
#include <string> #include <vector> #include <queue> using namespace std; vector<int> solution(int n, vector<vector<int>> roads, vector<int> sources, int destination) { vector<vector<int>> graph(n+1); for(const auto& road : roads){ graph[road[0]].push_back(road[1]); graph[road[1]].push_back(road[0]); } vector<int> answer(sources.size(), 0); vector<int> dest(n+1, -1); dest[destination] = 0; queue<pair<int, int>> Q; Q.push({destination, 0}); while(!Q.empty()){ int curPos = Q.front().first; int curCnt = Q.front().second; Q.pop(); for(int i = 0; i < graph[curPos].size(); i++){ int nextPos = graph[curPos][i]; if(dest[nextPos] == -1 || dest[nextPos] > curCnt + 1){ Q.push({nextPos, curCnt + 1}); dest[nextPos] = curCnt + 1; } } } for(int i = 0; i < sources.size(); i++){ answer[i] = dest[sources[i]]; } return answer; }
728x90'Coding Test > programmers' 카테고리의 다른 글
[프로그래머스] 조건에 부합하는 중고거래 댓글 조회하기 MySQL (0) 2023.09.19 [프로그래머스] 타겟 넘버 c++ (0) 2023.09.15 [프로그래머스] 공원 산책 c++ (0) 2023.09.09 [프로그래머스] 추억 점수 c++ (0) 2023.09.07 [프로그래머스] 달리기 경주 c++ (1) 2023.09.07 - 3 ≤ n ≤ 100,000