๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/3๋‹จ๊ณ„

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ

by Jaeguk 2022. 7. 13.
๋ฌธ์ œ ๋งํฌ

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

๋ฌด์ง€์™€ ์–ดํ”ผ์น˜๊ฐ€ ๊ฐ์ž์˜ ๋ชฉ์ ์ง€๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด ํƒ์‹œ๋ฅผ ์ด์šฉํ•  ๋•Œ, ์ตœ์†Œ ์ด์šฉ ์š”๊ธˆ์„ ๋ฆฌํ„ดํ•ด์ฃผ์ž.

ํ•ฉ์Šน์€ ํ•ด๋„๋˜๊ณ  ์•ˆํ•ด๋„ ๋œ๋‹ค.

 

ํ’€์ด

 ๋น„์šฉ์ด ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ๊ฐ์ž์˜ ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— "์ตœ๋‹จ๊ฑฐ๋ฆฌ" ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌด์ง€์™€ ์–ดํ”ผ์น˜๊ฐ€ ์–ด๋””๊นŒ์ง€ ํ•ฉ์Šน์„ ํ•˜๋Š” ๊ฒƒ์ด ๋น„์šฉ์ ์ธ ๋ฉด์—์„œ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๋ฐ”๋กœ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

๋ฌด์ง€์˜ ๋„์ฐฉ์ ์„ A, ์–ดํ”ผ์น˜์˜ ๋„์ฐฉ์ ์„ B๋ผ๊ณ  ํ–ˆ์„ ๋•Œ ํ•ฉ์Šนํ•ด์„œ ๊ฐ€๋Š” ์ค‘๊ฐ„์ง€์ ์„ C๋ผ๊ณ  ํ•˜์ž.

์ด๋“ค์˜ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๋ชจ์•„๋ณด๋ฉด, ์‹œ์ž‘์  -> C ( ํ•ฉ์Šน ), C -> A ( ๋ฌด์ง€ ), C -> B ( ์–ดํ”ผ์น˜ ) ์ด๋ ‡๊ฒŒ ์„ธ ๊ตฌ๊ฐ„์ด ์žˆ๋‹ค.

์„ธ ๊ตฌ๊ฐ„์„ ์ด๋™ํ•˜๋Š” ๋น„์šฉ์˜ ํ•ฉ์ด ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.

๋งŒ์•ฝ ์‹œ์ž‘์ ๊ณผ C๊ฐ€ ์ผ์น˜ํ•œ๋‹ค๋ฉด ํ•ฉ์Šน์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ด๋„ ๋œ๋‹ค.

 

 ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์—์„œ "ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ" ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜๋Š”๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค.

ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋“  ์ •์  ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 ์˜ˆ์ „์— ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ‘ํ–ˆ์„ ๋•Œ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์„œ ํฌ๊ธฐํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์— ์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ์œ„ํ•ด ๋‹ค์‹œ ์ฝ์–ด๋ดค๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ–ˆ๋‹ค.

์ž„์˜์˜ ์ •์  k๋ฅผ ๊ฒฝ์œ ์ง€๋กœ ์„ค์ •ํ•ด์„œ ๋‘ ์ •์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์›๋ฆฌ๋‹ค.

์ •์  i ์™€ j ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ  Dist[ i ][ j ] ๋ผ๊ณ  ํ•˜์ž.

๋ชจ๋“  ๊ฒฝ์œ ์ง€(์ •์ ) k์— ๋Œ€ํ•ด์„œ

๊ธฐ์กด์˜ Dist[ i ][ j ] ์™€ k๋ฅผ ๊ฒฝ์œ ํ•ด์„œ ๊ฐ€๋Š” Dist[ i ][ k ] + Dist[ k ][ j ] ๋‘ ๊ฐ’์„ ๋น„๊ตํ•ด์„œ Dist[ i ][ j ] ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

n๊ฐœ์˜ ์ •์ ์— ๋Œ€ํ•ด์„œ

for(int k = 1; k <= n; k++){ //๊ฒฝ์œ ์ง€ k
	for(int i = 1; i <= n; i++){ //์ž„์˜์˜ ์ •์  i
    		for(int j = 1; j <= n; j++){ //์ž„์˜์˜ ์ •์  j
        		Dist[i][j] = min(Dist[i][j], Dist[i][k] + Dist[k][j]);
        	}
	}
}

 

๋ชจ๋“  ์ •์  ์‚ฌ์ด์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ ํ›„,

ํ•ฉ์Šนํ•ด์„œ ๊ฐ€๋Š” ์ค‘๊ฐ„์ง€์  C๋ฅผ ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•ด ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘๊ณ 

Dist[ s ][ c ] + Dist[ c ][ a ] + Dist[ c ][ b ] ๊ฐ’ ์ค‘ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 200 + 5;
const int INF = INT_MAX;
int Dist[MAX_N][MAX_N];
 
void Init(){
    for(int i = 0;i <MAX_N; i++)
        for(int j = 0; j<MAX_N;j++){
            if(i == j)
                Dist[i][j] = 0;
            else Dist[i][j] = INF;
        }
}
 
void Floyd(int n){
    for(int i = 1; i<=n; i++//๊ฒฝ์œ ์ง€
        for(int j = 1; j<=n; j++)
            for(int k = 1; k<=n; k++){
                if(Dist[j][i] == INF || Dist[i][k] == INF)
                    continue;
                Dist[j][k] = min(Dist[j][k], Dist[j][i] + Dist[i][k]);
            }
}
 
int solution(int n, int s, int a, int b, vector<vector<int>> fares) {
    int answer = INF;
    Init();
    for(auto v : fares){
        int from = v[0];
        int to = v[1];
        int weight = v[2];
        Dist[from][to] = Dist[to][from] = weight;
    }
    Floyd(n);
    for(int i = 1; i<=n; i++){
        answer = min(answer, Dist[s][i] + Dist[i][a] + Dist[i][b]);
        //i๊นŒ์ง€ ํ•ฉ์Šน + A๋”ฐ๋กœ + B๋”ฐ๋กœ
    }
    return answer;
}
cs

 

์˜ˆ์ „์— ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฒ˜์Œ ์ ‘ํ–ˆ์„ ๋•Œ, ์ดํ•ด๊ฐ€ ์•ˆ ๋ผ์„œ ์ดํ•ดํ•˜๊ธฐ๋ฅผ ํฌ๊ธฐํ–ˆ์—ˆ๋‹ค.

๋‹ค์‹œ ๋ณด๋‹ˆ๊นŒ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์•„์„œ, ์ด ์ •๋„๋ฅผ ์ดํ•ดํ•˜๊ธฐ ํฌ๊ธฐํ–ˆ๋˜ ๊ณผ๊ฑฐ์˜ ๋‚˜๋ฅผ ๋ฐ˜์„ฑํ•˜๊ฒŒ ๋๋‹ค.

728x90