https://programmers.co.kr/learn/courses/30/lessons/72413
๋ฌธ์
๋ฐค๋ฆ๊ฒ ๊ท๊ฐํ ๋ ์์ ์ ์ํด ํญ์ ํ์๋ฅผ ์ด์ฉํ๋ ๋ฌด์ง๋ ์ต๊ทผ ์ผ๊ทผ์ด ์ฆ์์ ธ ํ์๋ฅผ ๋ ๋ง์ด ์ด์ฉํ๊ฒ ๋์ด ํ์๋น๋ฅผ ์๋ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๊ณ ์์ต๋๋ค. "๋ฌด์ง"๋ ์์ ์ด ํ์๋ฅผ ์ด์ฉํ ๋ ๋๋ฃ์ธ ์ดํผ์น ์ญ์ ์์ ๊ณผ ๋น์ทํ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ํ์๋ฅผ ์ข ์ข ์ด์ฉํ๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. "๋ฌด์ง"๋ "์ดํผ์น"์ ๊ท๊ฐ ๋ฐฉํฅ์ด ๋น์ทํ์ฌ ํ์ ํฉ์น์ ์ ์ ํ ์ด์ฉํ๋ฉด ํ์์๊ธ์ ์ผ๋ง๋ ์๋ ์ ์์ ์ง ๊ณ์ฐํด ๋ณด๊ณ "์ดํผ์น"์๊ฒ ํฉ์น์ ์ ์ํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ ์์ ๊ทธ๋ฆผ์ ํ์๊ฐ ์ด๋ ๊ฐ๋ฅํ ๋ฐ๊ฒฝ์ ์๋ 6๊ฐ ์ง์ ์ฌ์ด์ ์ด๋ ๊ฐ๋ฅํ ํ์๋
ธ์ ๊ณผ ์์์๊ธ์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆผ์์ A์ B ๋ ์ฌ๋์ ์ถ๋ฐ์ง์ ์ธ 4๋ฒ ์ง์ ์์ ์ถ๋ฐํด์ ํ์๋ฅผ ํ๊ณ ๊ท๊ฐํ๋ ค๊ณ ํฉ๋๋ค. A์ ์ง์ 6๋ฒ ์ง์ ์ ์์ผ๋ฉฐ B์ ์ง์ 2๋ฒ ์ง์ ์ ์๊ณ ๋ ์ฌ๋์ด ๋ชจ๋ ๊ท๊ฐํ๋ ๋ฐ ์์๋๋ ์์ ์ต์ ํ์์๊ธ์ด ์ผ๋ง์ธ ์ง ๊ณ์ฐํ๋ ค๊ณ ํฉ๋๋ค.
- ๊ทธ๋ฆผ์ ์์ ์ง์ ์ ๋ํ๋ด๋ฉฐ ์ ์์ ์ซ์๋ ์ง์ ๋ฒํธ๋ฅผ ๋ํ๋
๋๋ค.
- ์ง์ ์ด n๊ฐ์ผ ๋, ์ง์ ๋ฒํธ๋ 1๋ถํฐ n๊น์ง ์ฌ์ฉ๋ฉ๋๋ค.
- ์ง์ ๊ฐ์ ํ์๊ฐ ์ด๋ํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ ์ด๋ผ ํ๋ฉฐ, ๊ฐ์ ์ ํ์๋ ์ซ์๋ ๋ ์ง์ ์ฌ์ด์ ์์ ํ์์๊ธ์ ๋ํ๋
๋๋ค.
- ๊ฐ์ ์ ํธ์ ์ ์ง์ ์ผ๋ก ํ์๋์ด ์์ต๋๋ค.
- ์ ๊ทธ๋ฆผ ์์์์, 4๋ฒ ์ง์ ์์ 1๋ฒ ์ง์ ์ผ๋ก(4→1) ๊ฐ๊ฑฐ๋, 1๋ฒ ์ง์ ์์ 4๋ฒ ์ง์ ์ผ๋ก(1→4) ๊ฐ ๋ ์์ ํ์์๊ธ์ 10์์ผ๋ก ๋์ผํ๋ฉฐ ์ด๋ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง์ง ์์ต๋๋ค.
- ์์๋๋ ์ต์ ํ์์๊ธ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋ฉ๋๋ค.
- 4→1→5 : A, B๊ฐ ํฉ์นํ์ฌ ํ์๋ฅผ ์ด์ฉํฉ๋๋ค. ์์ ํ์์๊ธ์ 10 + 24 = 34์ ์ ๋๋ค.
- 5→6 : A๊ฐ ํผ์ ํ์๋ฅผ ์ด์ฉํฉ๋๋ค. ์์ ํ์์๊ธ์ 2์ ์ ๋๋ค.
- 5→3→2 : B๊ฐ ํผ์ ํ์๋ฅผ ์ด์ฉํฉ๋๋ค. ์์ ํ์์๊ธ์ 24 + 22 = 46์ ์ ๋๋ค.
- A, B ๋ชจ๋ ๊ท๊ฐ ์๋ฃ๊น์ง ์์๋๋ ์ต์ ํ์์๊ธ์ 34 + 2 + 46 = 82์ ์ ๋๋ค.
[๋ฌธ์ ]
์ง์ ์ ๊ฐ์ n, ์ถ๋ฐ์ง์ ์ ๋ํ๋ด๋ s, A์ ๋์ฐฉ์ง์ ์ ๋ํ๋ด๋ a, B์ ๋์ฐฉ์ง์ ์ ๋ํ๋ด๋ b, ์ง์ ์ฌ์ด์ ์์ ํ์์๊ธ์ ๋ํ๋ด๋ fares๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ด๋, A, B ๋ ์ฌ๋์ด s์์ ์ถ๋ฐํด์ ๊ฐ๊ฐ์ ๋์ฐฉ ์ง์ ๊น์ง ํ์๋ฅผ ํ๊ณ ๊ฐ๋ค๊ณ ๊ฐ์ ํ ๋, ์ต์ ์์ ํ์์๊ธ์ ๊ณ์ฐํด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
๋ง์ฝ, ์์ ํฉ์น์ ํ์ง ์๊ณ ๊ฐ์ ์ด๋ํ๋ ๊ฒฝ์ฐ์ ์์ ํ์์๊ธ์ด ๋ ๋ฎ๋ค๋ฉด, ํฉ์น์ ํ์ง ์์๋ ๋ฉ๋๋ค.
์ ํ ์ฌํญ
- ์ง์ ๊ฐฏ์ n์ 3 ์ด์ 200 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- ์ง์ s, a, b๋ 1 ์ด์ n ์ดํ์ธ ์์ฐ์์ด๋ฉฐ, ๊ฐ๊ธฐ ์๋ก ๋ค๋ฅธ ๊ฐ์
๋๋ค.
- ์ฆ, ์ถ๋ฐ์ง์ , A์ ๋์ฐฉ์ง์ , B์ ๋์ฐฉ์ง์ ์ ์๋ก ๊ฒน์น์ง ์์ต๋๋ค.
- fares๋ 2์ฐจ์ ์ ์ ๋ฐฐ์ด์ ๋๋ค.
- fares ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 2 ์ด์ n x (n-1) / 2 ์ดํ์
๋๋ค.
- ์๋ฅผ๋ค์ด, n = 6์ด๋ผ๋ฉด fares ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 2 ์ด์ 15 ์ดํ์ ๋๋ค. (6 x 5 / 2 = 15)
- fares ๋ฐฐ์ด์ ๊ฐ ํ์ [c, d, f] ํํ์ ๋๋ค.
- c์ง์ ๊ณผ d์ง์ ์ฌ์ด์ ์์ ํ์์๊ธ์ด f์์ด๋ผ๋ ๋ป์ ๋๋ค.
- ์ง์ c, d๋ 1 ์ด์ n ์ดํ์ธ ์์ฐ์์ด๋ฉฐ, ๊ฐ๊ธฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๋๋ค.
- ์๊ธ f๋ 1 ์ด์ 100,000 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- fares ๋ฐฐ์ด์ ๋ ์ง์ ๊ฐ ์์ ํ์์๊ธ์ 1๊ฐ๋ง ์ฃผ์ด์ง๋๋ค. ์ฆ, [c, d, f]๊ฐ ์๋ค๋ฉด [d, c, f]๋ ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ์ถ๋ฐ์ง์ s์์ ๋์ฐฉ์ง์ a์ b๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋๋ค.
ํ์ด
2๏ธโฃ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ์ด๋ดค๋ฐโผ๏ธ ์ฒ์์๋ Floyd-Warshall ๋ก ํ์๋๋ฐ, Dijkstra๋ก๋ ํ ์ ์์ ๊ฑฐ ๊ฐ์์ ์ฐธ๊ณ ๋ฅผ ํตํ์ฌ ๊ตฌํ๐คฆโ๏ธ
https://hyeyun.tistory.com/entry/Algorithm-ํ๋ก์ด๋-์์ฌ-Floyd-Warshall-์๊ณ ๋ฆฌ์ฆ
1๏ธโฃ Floyd-Warshall
๐ answer๋ฅผ ํฉ์นํ์ง ์๊ณ ๊ฐ๋ ๊ธ์ก์ผ๋ก ์ด๊ธฐํ ํ, ๊ฐ ์ง์ k ๊น์ง ํฉ์น + k์์ a + k์์ b ์ ๊ธ์ก๊ณผ ๋น๊ตํด์ ๊ฐ์ ๊ตฌํ๋ค
2๏ธโฃ Dijkstra
๐ costA ๋ฐฐ์ด : ๊ฐ ์ง์ c -> a ๋ก ๊ฐ๋ ์ต์ ๊ธ์ก
๐ costB ๋ฐฐ์ด : ๊ฐ ์ง์ c -> b ๋ก ๊ฐ๋ ์ต์ ๊ธ์ก
๐ costS ๋ฐฐ์ด : s -> ๊ฐ ์ง์ c ๋ก ๊ฐ๋ ์ต์ ๊ธ์ก
์ dijkstra ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํด์ฃผ๊ณ ๊ฐ ์ธ๋ฑ์ค์์์ ํฉ์ด ๊ฐ์ฅ ์ ์ ๊ฐ์ผ๋ก ๊ตฌํด์ฃผ์๋ค
์ ํ์ฑ ์ธก๋ฉด์์๋ Floyd-Warshall ์นโผ๏ธ
ํจ์จ์ฑ ์ธก๋ฉด์์๋ Dijkstra ์นโผ๏ธ
์ฝ๋
1๏ธโฃ Floyd-Warshall
public static int solutionFloyd(int n, int s, int a, int b, int[][] fares) {
int[][] floyd = new int[n+1][n+1];
for(int i = 1 ; i < n+1 ; i++){
for(int j = 1; j < n+1; j++){
floyd[i][j] = 20000001;
}
floyd[i][i] = 0;
}
for(int[] f : fares){
floyd[f[0]][f[1]] = f[2];
floyd[f[1]][f[0]] = f[2];
}
for(int k = 1 ; k < n+1 ; k++){
for(int i = 1; i < n+1; i++){
for(int j = 1 ; j < n+1 ; j++){
if(floyd[i][j] > floyd[i][k] + floyd[k][j]){
floyd[i][j] = floyd[i][k] + floyd[k][j];
}
}
}
}
int ans = floyd[s][a] + floyd[s][b];
for(int k = 1; k < n+1 ; k++){
ans = Math.min(ans, floyd[s][k] + floyd[k][a] + floyd[k][b]);
}
return ans;
}
2๏ธโฃ Dijkstra
static class edge implements Comparable<edge>{
int index;
int cost;
edge(int index, int cost){
this.index = index;
this.cost = cost;
}
@Override
public int compareTo(edge o) {
// TODO Auto-generated method stub
return this.cost - o.cost;
}
}
static ArrayList<edge>[] graph;
public static int solutionDijkstra(int n, int s, int a, int b, int[][] fares) {
int answer = Integer.MAX_VALUE;
graph = new ArrayList[n+1];
for(int i = 0 ; i < n+1 ; i++){
graph[i] = new ArrayList<>();
}
for(int[] f : fares){
graph[f[0]].add(new edge(f[1], f[2]));
graph[f[1]].add(new edge(f[0], f[2]));
}
int[] costA = new int[n+1]; // c -> a ๋ณ ๊ธ์ก
int[] costB = new int[n+1]; // c -> b ๋ณ ๊ธ์ก
int[] costS = new int[n+1]; // s -> c ๋ณ ๊ธ์ก
costA = dijkstra(a, costA);
costB = dijkstra(b, costB);
costS = dijkstra(s, costS);
for(int i = 1; i < n+1; i++){
answer = Math.min(answer, costA[i] + costB[i] + costS[i]);
}
return answer;
}
private static int[] dijkstra(int index, int[] cost) {
PriorityQueue<edge> pq = new PriorityQueue<>();
pq.offer(new edge(index, 0));
Arrays.fill(cost, 200000001);
cost[index] = 0;
while(!pq.isEmpty()){
edge now = pq.poll();
for(edge next : graph[now.index]){
if(cost[next.index] > cost[now.index] + next.cost){
cost[next.index] = cost[now.index] + next.cost;
pq.offer(next);
}
}
}
return cost;
}
'์๊ณ ๋ฆฌ์ฆ > ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ํ๋ก๊ทธ๋๋จธ์ค / Programmers Level 3 ] ๋ณดํ์ ์ฒ๊ตญ (0) | 2021.09.30 |
---|---|
[ ํ๋ก๊ทธ๋๋จธ์ค / Programmers Level 3 ] ๊ฒฝ์ฃผ๋ก ๊ฑด์ค (0) | 2021.09.30 |
[ ํ๋ก๊ทธ๋๋จธ์ค / Programmers Level 3 ] ๋จ์ด ๋ณํ (0) | 2021.09.29 |
[ ํ๋ก๊ทธ๋๋จธ์ค / Programmers Level 3 ] ๋ฑ๊ตฃ๊ธธ (0) | 2021.09.29 |
[ ํ๋ก๊ทธ๋๋จธ์ค / Programmers Level 3 ] ์ด์ค์ฐ์ ์์ํ (0) | 2021.09.29 |