๋ฌธ์ :
programmers.co.kr/learn/courses/30/lessons/72413
๋ถ์ :
์ฒซ๋ฒ์งธ ์ ๊ทผ
๋ฌธ์ ๋ฅผ ๋ณด์ํ๋ a์ b๊ฐ ๋ฐ๋ก ๊ฐ์๋์ ์ค๊ฐ ์ง์ ๊ฑธ์ณ์ ๋์ฐฉํ ์๊ธ ์ค ์ต์ ์๊ธ์ ์ถ๋ ฅํ๋ผ๋ ๋ง์ ๋ณด๊ณ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ ์ฌ๋ ธ๋ค. ๊ทธ๋์ ๋ค์ต์คํธ๋ผ๋ก ์ ๊ทผํ๋ฉด ๋๊ฒ ๊ตฌ๋ ํ๊ณ
s ์ถ๋ฐ์ง์ ์์ int cost = dijkstra(s, a) + dijkstra(s, b); a๋ a ๋์ฐฉ์ง๊น์ง ์ต๋จ ๊ฒฝ๋ก + b๋ b ๋์ฐฉ์ง๊น์ง ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ํ cost๊ฐ๊ณผ
์ค๊ฐ ์ง์ ์ ๊ฑฐ์ณ ๊ฐ ๊ฒฝ์ฐ cost = min(cost, dijkstra(i, a) + dijkstra(i, b) + dijkstra(s, i)); for๋ฌธ์ ๋๋ ค ๋ชจ๋ ๋ ธ๋์ ๋ํด i ์ค๊ฐ ์ง์ ์ ๊ฑฐ์ณ ๊ฐ ๊ฒฝ์ฐ ์ค ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ํ๋ฉด ๋๊ฒ ๋ค ํ๋ค.
ํ์ง๋ง ์๊ฐ ์ด๊ณผ .. no ...
๊ทธ๋์ ํ๋ก์ด๋ ์์ฌ๋ก ์ ๊ทผํ๋๊ฒ ์คํ๋ ค ๋น ๋ฅผ ์๋ ์๋ค ํ๋๋ฐ
๋ด ์ฝ๋์์ ์๊ฐ์ ์ค์ผ ์ ์๋ ๋ถ๋ถ์ ์ฐพ์๋ณด๊ธฐ๋ก ํ๋ค.
main ํจ์์์ ๋ค์ต์คํธ๋ผ ํจ์๋ฅผ ๋ถ๋ฅผ๋ 3์ค for๋ฌธ์ด ๋๋ฏ๋ก ์ด ๋ถ๋ถ์์ ๋ค์ต์คํธ๋ผ๋ฅผ ์ ๊ฒ ๋ถ๋ฅด๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ์๋ค.
c++ ์ฝ๋ : ์๊ฐ ์ด๊ณผ ๋ ์ฝ๋ ๐ต
//
// [KAKAO] 2021_sharedTaxi.cpp
// SOMA๐ฉ๐ป๐ป
//
// Created by JoSoJeong on 2021/04/28.
//
#include <stdio.h>
#include <iostream>
#include <queue>
#include <algorithm>
#define INF 1e9
using namespace std;
priority_queue<pair<int, int>> pq;
vector<pair<int, int>> vertex[201];
int d[201]; //๊ฑฐ๋ฆฌ์ ํฉ
int dijkstra(int start, int end){
fill(d, d+201, INF);
pq.push({0, start});
d[start] = 0;
while(!pq.empty()){
int dist = -pq.top().first;
int now = pq.top().second;
pq.pop();
for (int i = 0; i< vertex[now].size(); i++) {
int cost = dist + vertex[now][i].second;
if(cost <d[vertex[now][i].first]) // ๋น์ฉ์ด ๋ ์๋ค๋ฉด ์ต๋จ๊ฒฝ๋ก ํ
์ด๋ธ ๊ฐ์ ๊ฐฑ์ .
{
d[vertex[now][i].first] = cost;
pq.push(make_pair(-cost, vertex[now][i].first));
}
}
}
return d[end];
}
int main(){
// n - ์ง์ ์ ๊ฐ์, s - ์์, a - a ๋์ฐฉ , b - b ๋์ฐฉ
int n = 6; int s =4; int a = 5; int b = 6;
// vector<vector<int>> fares = {{4, 1, 10}, {3, 5, 24}, {5, 6, 2}, {3, 1, 41}, {5, 1, 24}, {4, 6, 50}, {2, 4, 66}, {2, 3, 22}, {1, 6, 25}};
// vector<vector<int>> fares = {{5, 7, 9}, {4, 6, 4}, {3, 6, 1}, {3, 2, 3}, {2, 1, 6}};
vector<vector<int>> fares = {{2, 6, 6}, {6, 3, 7}, {4, 6, 7}, {6, 5, 11}, {2, 5, 12}, {5, 3, 20}, {2, 4, 8}, {4, 3, 9}};
for(int i = 0; i < fares.size(); i++){//9
vertex[fares[i][0]].push_back({fares[i][1], fares[i][2]});
vertex[fares[i][1]].push_back({fares[i][0], fares[i][2]});
}
//๋ฐ๋ก ๊ฐ์๋์ ๋น์ฉ
int cost = dijkstra(s, a) + dijkstra(s, b);
//์ค๊ฐ ์ง์ ๊ฑฐ์ณ ๊ฐ์๋์ ๋น์ฉ
for(int i = 1; i<= n; i++){
if (i != s){//4๊ฐ ์๋๋
if(dijkstra(i, a) == 1000000000 || dijkstra(i, b) == 1000000000) continue; //๋จ์ด์ ธ ์์ผ๋ฏ๋ก ๋ชป๊ฐ
cost = min(cost, dijkstra(i, a) + dijkstra(i, b) + dijkstra(s, i));
}
}
cout << cost << '\n';
return 0;
}
2๊ฐ์ ์๊ฐ ์ด๊ณผ ์ธ์ ์ง์ ๋ ์ฝ๋ ๐๐๐ป
๊ฐ์ ํ ์ฌํญ : ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ ๋ ๋์ฐฉ์ง๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐํํ๋ int ํ ํจ์์์ void ํจ์๋ก ๋ฐ๊พธ์๊ณ main ํจ์ ๋ด์ ํ์ํ ์ต๋จ ๊ฒฝ๋ก ๊ตฌํ๋ ๋ฐฐ์ด์ ์์ฑํ์ฌ ํจ์ ํธ์ถ ์์ด ๋ฐฐ์ด์ ๊ฐ ์ฐธ์กฐ ํ์์ผ๋ก ๋ฐ๊พธ์๋ค.
//
// [KAKAO] 2021_sharedTaxi.cpp
// SOMA๐ฉ๐ป๐ป
//
// Created by JoSoJeong on 2021/04/28.
//
#include <stdio.h>
#include <iostream>
#include <queue>
#include <algorithm>
#define INF 1e9
using namespace std;
priority_queue<pair<int, int>> pq;
vector<pair<int, int>> vertex[201];
void dijkstra(int d[], int start){
fill(d, d+201, INF);
pq.push({0, start});
d[start] = 0;
while(!pq.empty()){
int dist = -pq.top().first;
int now = pq.top().second;
pq.pop();
for (int i = 0; i< vertex[now].size(); i++) {
int cost = dist + vertex[now][i].second;
if(cost <d[vertex[now][i].first]) // ๋น์ฉ์ด ๋ ์๋ค๋ฉด ์ต๋จ๊ฒฝ๋ก ํ
์ด๋ธ ๊ฐ์ ๊ฐฑ์ .
{
d[vertex[now][i].first] = cost;
pq.push(make_pair(-cost, vertex[now][i].first));
}
}
}
}
int main(){
// n - ์ง์ ์ ๊ฐ์, s - ์์, a - a ๋์ฐฉ , b - b ๋์ฐฉ
int n = 6; int s =4; int a = 5; int b = 6;
// vector<vector<int>> fares = {{4, 1, 10}, {3, 5, 24}, {5, 6, 2}, {3, 1, 41}, {5, 1, 24}, {4, 6, 50}, {2, 4, 66}, {2, 3, 22}, {1, 6, 25}};
// vector<vector<int>> fares = {{5, 7, 9}, {4, 6, 4}, {3, 6, 1}, {3, 2, 3}, {2, 1, 6}};
vector<vector<int>> fares = {{2, 6, 6}, {6, 3, 7}, {4, 6, 7}, {6, 5, 11}, {2, 5, 12}, {5, 3, 20}, {2, 4, 8}, {4, 3, 9}};
for(int i = 0; i < fares.size(); i++){//9
vertex[fares[i][0]].push_back({fares[i][1], fares[i][2]});
vertex[fares[i][1]].push_back({fares[i][0], fares[i][2]});
}
// - ์ถ๊ฐํ ์ฌํญ -
int sd[201]; //๊ฑฐ๋ฆฌ์ ํฉ
int id[201]; //๊ฑฐ๋ฆฌ์ ํฉ
dijkstra(sd, s);
//๋ฐ๋ก ๊ฐ์๋์ ๋น์ฉ
int cost = sd[a] + sd[b];
//์ค๊ฐ ์ง์ ๊ฑฐ์ณ ๊ฐ์๋์ ๋น์ฉ
for(int i = 1; i<= n; i++){
// (์ด ๋ถ๋ถ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ฐ์ด๊ณผ๊ฐ ๋๋ ๋ฏ ํ๋ค)
dijkstra(id, i);
if (i != s){//4๊ฐ ์๋๋
if(id[a] == 1000000000 || id[b] == 1000000000 ) continue; //๋จ์ด์ ธ ์์ผ๋ฏ๋ก ๋ชป๊ฐ
cost = min(cost, id[a] + id[b] + sd[i]);
}
}
cout << cost << '\n';
return 0;
}
๊ฒฐ๊ณผ :
๋๊ฐ๊ฐ ๋ง์ ๊ฑธ๋ฆฌ์ง๋ง .. ๋ค์์ ์์ ๋ ํจ์จ์ ์ธ ์ฝ๋๋ก ํ๊ธฐ๋ก ๐ฅฒ
๋๊ธ