관리 메뉴

기억을 위한 기록들

[프로그래머스 lv 2 ] - 배달 본문

Coding Test - cpp/Etc

[프로그래머스 lv 2 ] - 배달

에드윈H 2021. 4. 26. 12:25

programmers.co.kr/learn/courses/30/lessons/12978

 

코딩테스트 연습 - 배달

5 [[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]] 3 4 6 [[1,2,1],[1,3,2],[2,3,2],[3,4,3],[3,5,2],[3,5,3],[5,6,1]] 4 4

programmers.co.kr

 

#include <iostream>
#include <vector>
#include <queue>

using namespace std;
vector<int> result; //1번부터 각각의 번호들까지의 가중치 저장 
vector < pair<int, int>> saveRoad[51]; //간선정보
void Dijkstra(int N)
{
	priority_queue<pair<int, int>> pQ;
	pQ.push(make_pair(1, 0)); //1번지점부터 시작 

	result.resize(N + 1, 2e9);

	result[1] = 0; //1번 자기자신 가중치는 0

	while (!pQ.empty())
	{
		int cur = pQ.top().first; //현재 번호
		int weight = pQ.top().second; //현재 가중치
		pQ.pop();

		if (result[cur] < weight) //저장되어있는 가중치가 더 낮으면 패스
			continue;

		for (int i = 0; i < saveRoad[cur].size(); i++) 
		{
			int nextNum = saveRoad[cur][i].first;
			int nextWeight = saveRoad[cur][i].second + weight;

			if (nextWeight < result[nextNum])
			{
				result[nextNum] = nextWeight; //1번부터 nextNum번까지의 가야하는 가중치 저장
				pQ.push(make_pair(nextNum, result[nextNum]));
			}
		}
	}
}
int solution(int N, vector<vector<int>> road, int K) {
	int answer = 0;

	for (int i = 0; i < road.size(); i++)
	{
		saveRoad[road[i][0]].push_back(make_pair(road[i][1], road[i][2]));//연결된 도로와 가중치 입력		
		saveRoad[road[i][1]].push_back(make_pair(road[i][0], road[i][2]));
	}
	Dijkstra(N);
	for (int i = 1; i <= N; i++)
	{
		if (result[i] <= K)
		{
			answer++;
		}
	}

	return answer;
}