GitHubSeob
C++ / 프로그래머스 / 부대복귀 본문
문제
https://school.programmers.co.kr/learn/courses/30/lessons/132266
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이
BFS문제이다. 목적지가 나와있으므로 목적지를 시작으로 모든 다리를 건너 갈 수 있는 경우를 탐색했다.
다리의 정보가 담긴 roads벡터에서는 {1, 2}, {2, 3} 이런식으로 나와있어 따로 road벡터로 탐색시간을 줄이고자 한다.
road벡터에는 road[1]에는 1과 연결된 다리들을, road[2]에는 2와 연결된 다리들을 이런식으로 road[n]에는 n과 연결된 다리의 정보가 담긴다. 다리는 양방향이므로 각각 서로 연결된 다리 번호를 저장한다.
visit벡터는 갈 수 없는 곳인 경우 -1을 출력해야하므로 -1로 초기화를 했다.
그 외의 경우는 몇번만에 갔는지를 저장한다.
while (!q.empty()) {
num = q.front()[0];
cnt = q.front()[1];
q.pop();
for (idx = 0; idx < road[num].size(); ++idx) {
int next = road[num][idx];
if (visit[next] == -1) {
visit[next] = cnt + 1;
q.push({ next, cnt + 1 });
}
}
}
목적지부터 큐에 넣고 시작한다.
num은 현재 위치이고 road벡터를 통해 갈 수 있는 다리들을 찾아본다.
다리와 연결된 곳이 -1일 때만 (최초로 갈 때만) visit[next]의 값을 바꾸고 큐에 push한다.
이 작업들을 큐가 비워질때까지 반복한다.
for (idx = 0; idx < sources.size(); ++idx) {
answer[idx] = visit[sources[idx]];
}
반복문이 종료됐으면 결과를 내보내야 하므로 아군의 위치가 담겨있는 sources벡터를 돌면서 answer에 방문 값을 저장한다.
코드
#include <string>
#include <vector>
#include <queue>
using namespace std;
vector<int> solution(int n, vector<vector<int>> roads, vector<int> sources, int destination) {
int idx(0), num(0), cnt(0);
queue<vector<int>>q;
vector<int>visit(n + 1, -1);
vector<int>answer(sources.size(), 0);
vector<vector<int>>road(n + 1, vector<int>(0, 0));
for (idx = 0; idx < roads.size(); ++idx) {
road[roads[idx][0]].push_back(roads[idx][1]);
road[roads[idx][1]].push_back(roads[idx][0]);
}
q.push({ destination,0 });
visit[destination] = 0;
while (!q.empty()) {
num = q.front()[0];
cnt = q.front()[1];
q.pop();
for (idx = 0; idx < road[num].size(); ++idx) {
int next = road[num][idx];
if (visit[next] == -1) {
visit[next] = cnt + 1;
q.push({ next, cnt + 1 });
}
}
}
for (idx = 0; idx < sources.size(); ++idx) {
answer[idx] = visit[sources[idx]];
}
return answer;
}
'Programmers > Level 3' 카테고리의 다른 글
C++ / 프로그래머스 / 인사고과 (0) | 2023.06.27 |
---|---|
C++ / 프로그래머스 / 거스름돈 (0) | 2023.06.27 |
C++ / 프로그래머스 / 디스크 컨트롤러 (0) | 2023.06.27 |
C++ / 프로그래머스 / 단어 변환 (0) | 2023.06.26 |
C++ / 프로그래머스 / 야근 지수 (0) | 2023.06.26 |