Programmers Review

[Lv 2] 배달

hanseongbugi 2024. 10. 9. 14:50

https://school.programmers.co.kr/learn/courses/30/lessons/12978

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

다익스트라 알고리즘을 사용하면 쉽게 해결할 수 있다.

 

road 배열 속 요소는 다익스트라 알고리즘을 사용하는데 불편하므로 

graph 배열 속에 요소를 새롭게 삽입한다.

for(int i = 0;i<road.size();i++){
        int a = road[i][0];
        int b = road[i][1];
        int c = road[i][2];
        graph[a].push_back({b,c});
        graph[b].push_back({a,c});
    }

 

요소를 새롭게 삽입한 이후, 우선순위 큐를 사용해 다익스트라 알고리즘을 구현한다.

 

다익스트라 알고리즘을 이용해 1번째 노드에 대한 최소 비용의 경로를 구했다면

1번노드에서 2, 3, 4, ... 번 노드로 이동할 때 K보다 작은 비용의 수를 구한다.

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int dist[51];
vector<pair<int,int>> graph[51];

int solution(int N, vector<vector<int> > road, int K) {
    int answer = 0;
    
    for(int i = 1;i<=N;i++)
        dist[i] = 987654321;
    for(int i = 0;i<road.size();i++){
        int a = road[i][0];
        int b = road[i][1];
        int c = road[i][2];
        graph[a].push_back({b,c});
        graph[b].push_back({a,c});
    }
    
    priority_queue<pair<int,int>> pq;
    pq.push({0, 1});
    dist[1] = 0;
    
    while(!pq.empty()){
        int cost = -pq.top().first;
        int now = pq.top().second;
        pq.pop();
        
        if(dist[now] < cost)
            continue;
        
        for(int i = 0;i<graph[now].size();i++){
            int next = graph[now][i].first;
            int nCost = graph[now][i].second;
            
            if(cost + nCost < dist[next]){
                dist[next] = cost + nCost;
                pq.push({-dist[next], next});
            }
        }
    }
    for(int i = 1;i<=N;i++){
        if(dist[i] <= K)
            answer++;
    }
    return answer;
}