https://school.programmers.co.kr/learn/courses/30/lessons/118669
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
생각의 흐름
- 최단 길이? 다익스트라를 사용하자
- paths를 vector배열로 변경
- 산봉우리에서 다른 곳으로 가면 안되니까 peaks에 산봉우리는 저장하여 priority queue에 넣어줄때 peaks에 체크가 되어있으면 안넣고 진행
- 시작점을 굳이 하나로 정할 이유가 있을까?
- gates모두가 시작점이 될 수있고 목적지는 summits 전체이므로 시작점에 gates 값들을 전부 집어넣자!
- 최소 값만 구하면 되니까 정렬 보다는 단순 최대 값을 꺼내 오는걸로 하자
코드
더보기
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
vector<pair<int, int> > ways[50001];
bool peaks[50001];
int dist[50001];
void init(vector<vector<int>> paths, vector<int> summits){
for(int i=0, sz=paths.size();i<sz;++i){
int a = paths[i][0];
int b = paths[i][1];
int cost = paths[i][2];
ways[a].push_back({b,cost});
ways[b].push_back({a,cost});
}
fill(&peaks[0],&peaks[50001],false);
for(int i=0, sz=summits.size();i<sz;++i){
peaks[summits[i]]=true;
}
fill(&dist[0],&dist[50001],987654321);
}
vector<int> calc(int n, vector<int> gates){
priority_queue<pair<int, int> > pq;
for(int i=0, sz=gates.size();i<sz;++i){
pq.push({0,gates[i]});
dist[gates[i]] = 0;
}
while(!pq.empty()){
int st=pq.top().second;
int cost=-pq.top().first;
pq.pop();
if(dist[st]<cost)
continue;
for(int i=0, sz=ways[st].size();i<sz;++i){
int next = ways[st][i].first;
int ncost = ways[st][i].second>cost?ways[st][i].second:cost;
if(dist[next] <= ncost)
continue;
dist[next] = ncost;
if(!peaks[next])
pq.push({-ncost,next});
}
}
vector<int> answer;
int gate=0;
for(int i=0;i<=n;++i){
if(peaks[i]&&dist[i]<dist[gate])
gate=i;
}
answer.push_back(gate);
answer.push_back(dist[gate]);
return answer;
}
vector<int> solution(int n, vector<vector<int>> paths, vector<int> gates, vector<int> summits) {
vector<int> answer;
init(paths, summits);
answer=calc(n, gates);
return answer;
}
결과

728x90
'알고리즘 > 프로그래머스 문제' 카테고리의 다른 글
| [ALGORITHM] LEVEL3 2022 KAKAO TECH INTERNSHIP - 코딩 테스트 공부 (0) | 2022.12.21 |
|---|---|
| [ALGORITHM] LEVEL4 2022 KAKAO TECH INTERNSHIP - 행렬과 연산 c++ (0) | 2022.12.16 |
| [ALGORITHM] LEVEL4 - 쌍둥이 빌딩 숲 (0) | 2022.12.03 |
| [ALGORITHM] LEVEL3 - 억억단을 외우자 (0) | 2022.12.02 |
| [ALGORITHM] LEVEL2 - 귤 고르기 (0) | 2022.11.28 |
댓글