


코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
int cost[201][201];
int INF = 10000000;
int solution(int n, int s, int a, int b, vector<vector<int>> fares) {
int answer = 0;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cost[i][j] = INF;
for(int i=1; i<=n; i++)
cost[i][i] = 0;
for(int i=0; i<fares.size(); i++)
{
int v1 = fares[i][0];
int v2 = fares[i][1];
cost[v1][v2] = fares[i][2];
cost[v2][v1] = fares[i][2];
}
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cost[i][j] = min(cost[i][j], cost[i][k] + cost[k][j]);
int solo = cost[s][a] + cost[s][b]; //합승안하고 각자갔을 경우
answer = solo;
//합승할 경우
for(int i=1; i<=n; i++) //어디서 내릴지?
{
int cost_sum = 0;
if (i == s) continue;
cost_sum += cost[s][i] + cost[i][a] + cost[i][b];
answer = min(answer, cost_sum);
}
return answer;
}
|
cs |
플로이드 와샬 알고리즘을 적용하면 쉽게 풀 수 있는 문제였다.
Vertex i에서 Vertex j로 가는데 드는 최소 비용을 모든 vertex에 대해서 구해놓고, 그 배열을 이용하여 문제가 요구하는 바를 충족시키는 해를 찾으면 된다.
우선 합승을 안하는 경우가 최소일 수도 있으므로 먼저 계산한 후, 합승하였을 경우를 고려한다.
합승하는 경우 두 가지 경우가 존재한다.
1) A와 B가 합승하여 A, B의 도착지가 아닌 다른 곳에서 멈춘 후 각자의 도착지로 택시를 타고 가는 경우
2) A와 B가 합승하여 A나 B의 도착지에서 멈춘 후 나머지 한 명의 도착지로 택시를 타고 가는 경우
따라서 "어디서 내릴지"를 기준으로 반복문을 작성하여 가장 최소가 되는 cost_sum을 구하면 된다.
'Study > Programmers' 카테고리의 다른 글
프로그래머스 - 메뉴 리뉴얼(2021 KAKAO BLIND RECRUITMENT) (0) | 2021.04.16 |
---|---|
프로그래머스 - 신규 아이디 추천(2021 KAKAO BLIND RECRUITMENT) (0) | 2021.04.16 |
프로그래머스 - 순위 (0) | 2021.04.15 |
프로그래머스 - 섬 연결하기 (0) | 2021.04.14 |
프로그래머스 - 여행 경로 (0) | 2021.04.14 |