본문 바로가기

Algorithm/Programmers

[Programmers] 합승 택시 요금

안녕하세요. 오늘은 Programmers 합승 택시 요금을 풀어보도록 하겠습니다.

 

해당 문제는 

https://programmers.co.kr/learn/courses/30/lessons/72413

 

코딩테스트 연습 - 합승 택시 요금

6 4 6 2 [[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]] 82 7 3 4 1 [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] 14 6 4 5 6 [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4

programmers.co.kr

 

위 링크에서 확인하실 수 있습니다.

 

진짜 맨날 문자열, 구현에 고통 많이 받았는데 그나마 숨이 좀 트이는 문제입니다.

문제의 n제한이 200까지이기 때문에 통상적으로 n^3의 알고리즘을 쓰더라도 큰 문제가 없습니다.

그리고 그래프에 가중치가 있고, 음의 가중치가 없기 때문에

 

다익스트라 or 플로이드 와샬 둘 중 하나를 쓰는 문제이겠거니 짐작하고 들어가시면 좋습니다.

 

결론적으로 이 문제는 플로이드 와샬로 해결하였는데, 

 

시작 지점이 s라고 하고 환승이 끝나는 지점을 x라고 해보면, 

 

s -> x (공통)

x -> a 

x -> b

 

세 값을 더한 결과가 최소가 되는 x를 찾으면 됩니다. 플로이드 와샬 알고리즘을 사용하게 되면 모든 정점부터 모든 정점까지 거리의 최솟값을 구할 수 있습니다. 따라서 미리 모든 정점부터 정점까지의 최단거리를 구해놓은 다음에

위 식의 결과가 최소가 되는 x값만 마지막에 구해주시면 됩니다.

 

<소스 코드>

#include <bits/stdc++.h>
using namespace std;

int d[204][204];
int solution(int n, int s, int a, int b, vector<vector<int>> fares) {
    int answer = 10000004;
    fill(&d[0][0], &d[0][0]+204*204, 10000004);
    for(int i = 0; i < fares.size(); i++) {
        d[fares[i][0]][fares[i][1]] = fares[i][2];
        d[fares[i][1]][fares[i][0]] = fares[i][2];
    }
    for(int i = 1; i <= n; i++)
        d[i][i] = 0;
    
    // floydWarshall
    for(int k = 1; k <= n; k++) {
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) 
                if(d[i][k]+d[k][j] < d[i][j]) d[i][j] = d[i][k]+d[k][j];
        }
    }
    
    for(int i = 1; i <= n; i++) {
        int fare = d[s][i] + d[i][a] + d[i][b];
        answer = min(answer, fare);       
    }
    
    return answer;
}

 

*저의 글에 대한 피드백이나 지적은 언제나 환영합니다. 

'Algorithm > Programmers' 카테고리의 다른 글

[Programmers] 섬 연결하기  (0) 2021.09.07
[Programmers] 위클리 챌린지 6  (0) 2021.09.06
[Programmers] 방금 그곡  (0) 2021.09.01
[Programmers] 후보키  (0) 2021.09.01
[Programmers] 위클리 챌린지 5주차 - 모음 사전  (0) 2021.08.30