반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
여러개의 등산 코스가 있을 때 각 코스의 휴식 없이 이동해야 하는 시간중 가장 큰 시간을 K라고 할때
각 코스의 K중 가장 작은 것을 찾는 문제입니다.
조건 1. 각 등산 코스에서 휴식 없이 이동해야 하는 시간중 가장 큰 시간을 찾자
조건 2. 각 코스의 가장 높은 비용의 간선들 중 가장 작은 비용의 간선을 가진 코스를 선택하자.
풀이 방법
모든 경로를 탐색하는 DFS를 사용하여도 풀이가 가능합니다. 다만 시간 초과의 위험이 있기 때문에
각 노드를 한번 씩만 방문하여 해결 할 수 있게 해주는 Dijkstra 알고리즘을 이용하면 됩니다.
Dijkstra알고리즘에서 사용하는 우선순위 큐는 가장 낮은 비용의 간선을 우선순위로 배정해줍니다.
때문에 조건 2는 자동으로 해결됩니다.
문제 해결 과정에서 가장 높은 비용을 제외한 모든 비용들은 알 필요가 없습니다.
즉 우선순위 큐에 다음 비용을 넣을 때 현재 간선의 비용과 현재까지의 가장 큰 비용중 더 큰 값을 보내면 됩니다.
정답 코드
#include <vector>
#include <queue>
# define INF 10000001
using namespace std;
static vector<bool>visited;
static vector<vector<pair<int,int>>> v;
static bool isTop[50001];
int answer[2] {0, INF};
vector<int> solution(int n, vector<vector<int>> paths, vector<int> gates, vector<int> summits) {
v.resize(n + 1);
visited.resize(n + 1);
for (auto path : paths)
{
v[path[0]].push_back(make_pair(path[1], path[2]));
v[path[1]].push_back(make_pair(path[0], path[2]));
}
for (int& n : summits)
isTop[n] = true;
BFS(gates);
return {answer[0], answer[1]};
}
void dijkstra(vector<int>& gates)
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
for(int& n : gates)
q.push(make_pair(0, n));
while(!q.empty())
{
int node = q.top().second;
int cost = q.top().first;
q.pop();
visited[node] = true;
if (cost > answer[1])
continue;
if (isTop[node])
{
if (cost < answer[1])
{
answer[0] = node;
answer[1] = cost;
}
else if (node < answer[0])
{
answer[0] = node;
}
continue;
}
for (auto p : v[node])
{
int next = p.first;
int nxtCost = p.second;
if (visited[next])
continue;
nxtCost = max(p.second, cost);
q.push(make_pair(nxtCost, next));
}
}
}
반응형
LIST
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
행렬과 연산 [Lv. 4] (0) | 2024.06.11 |
---|---|
코딩테스트 연습 [Lv. 3] (0) | 2024.06.11 |
두 큐 합 같게 만들기 [Lv. 2] (1) | 2024.06.08 |
1, 2, 3 떨어뜨리기 [Lv.4] (0) | 2024.06.07 |
표 병합 [Lv. 3] (0) | 2024.06.04 |