1. ๋ฌธ์ ์ค๋ช ๐
๋ฌด์ง๋ ์ดํผ์น๋ ์ผ๊ทผ์ ๋๋ด๊ณ , ์ง์ ๊ฐ๋ ค๊ณ ํจ.
๋ฒ์ค๊ฐ ๋๊ฒจ์ ํ์๋ฅผ ํ์ผ ํ๋๋ฐ, ํ์ ์๊ธ์ด ๊ฑฑ์ ๋จ.
๋ง์นจ ๋ฌด์ง๋ ์ดํผ์น๊ฐ ์ง ๊ฐ๋ ๋ฐฉํฅ์ด ๊ฐ์ ์ชฝ์ด๋ผ, ์ต๋ํ ํฉ์นํด์ ์ ์ฒด ํ์ ๋น์ฉ์ ์ค์ด๋ ค๊ณ ํจ. ๋ค๋ง ํฉ์นํ์ง ์๊ณ ๊ฐ๋๊ฒ ์ ์ฒด ํ์ ๋น์ฉ์ด ๋ ์์ ๊ฒฝ์ฐ, ๊ทธ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ํํจ.
ํ์ฌ ์์น : s, ๋ฌด์ง ์ง: a, ์ดํผ์น ์ง: b ์ ์์น๊ฐ ์ฃผ์ด์ง๋ค๊ณ ์น์.
์ดํผ์น์ ๋ฌด์ง์ ํ์ ์๊ธ์ ์ ๋ถ ํฉ์ณค์ ๋, ์ต์ ํ์ ์๊ธ์ ๋ฐํํ๋ผ.
ํํธ
๋ง ์ป๊ณ ๊ฐ์ค ๋ถ๋ค์ ์ ๊ทผ ๋ฐฉ์๊น์ง๋ง ๋ณด๊ณ ๊ฐ์๊ธธ ๋ฐ๋ผ๊ณ , ํ์ด๋ฒ์ ๋ณด์ค ๋ถ๋ค
์ ๋๊น์ง ์ฝ์ด์ฃผ์๋ผ
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: ๋ค์ต์คํธ๋ผ
ํด๋น ๋ฌธ์ ๊ฐ ๋ค์ต์คํธ๋ผ์ธ ๊ฒ์ ์์์ฑ๊ธฐ๋ ์ฝ์ง๋ง ๊ฑฐ๊ธฐ์ ๋ํด ์์ด๋์ด๊ฐ ํ์ํ๋ค. ์๋ํ๋ฉด ๊ทธ์ ์ต์ ํ์ ๋น์ฉ์ ๋ฐํํ๋ผ ํ๊ธฐ์, ํฉ์น ์์ด ์ฒ์๋ถํฐ ๋ฐ๋ก ํ์๋ฅผ ํ์ ๋์ ์๊ธ์ด ์ต์์ธ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
(1) ์ฒ์ ๋ด๊ฐ ๋ ์ฌ๋ฆฐ ํ์ด
์ถ๋ฐ์ง โ ๋ฌด์ง์ง
,์ถ๋ฐ์ง โ ์ดํผ์น์ง
์ต์ ๋น์ฉ์ ๊ฐ๊ฐ ๋ค์ต์คํธ๋ผ๋ก ๊ตฌํ๋ค.- ๊ทธ ๋ ์ค ๊ฒฝ๋ก๊ฐ ๊ฒน์น๋ ๊ฒ์ด ์๋์ง ํ์ธํ๋ค.
- ๊ฒน์น ๊ฒฝ๋ก๋งํผ์ ๋น์ฉ์ ๋นผ์ ์ค๋ณต์ ์ค์ธ๋ค.
ํ์ง๋ง ํด๋น ํ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๊ตฌํํ์ง ๋ชปํ๊ณ ๋ง๋ ํ์ด๋ ์๋๋ค.
์ฒซ์งธ, ๋ค์ต์คํธ๋ผ 2๊ฐ ๋น์ฉ์ ํฉ
- ์ค๋ณต ๊ฒฝ๋ก์ ๋น์ฉ
์ด ์ต์ ๋น์ฉ์ด ๋ง๋๊ฐ? ์๋ ์ ์๋ค. ์๋ํ๋ฉด ๊ฒฝ์ ์ง๋ฅผ ์ต๋ํ ๋ง์ด ํ์ฉํด์ ์ต์ ๋น์ฉ์ ๋ ์ค์ด๋ ๊ฒฝ์ฐ์ ์๊ฐ ์์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋์งธ, ์ค๋ณต ๊ฒฝ๋ก ์ฐพ๊ธฐ๊ฐ ๋๋ฌด ๊น๋ค๋ก์ ๋ค.
๊ทธ๋์ ๋ค๋ฅธ ์ฌ๋์ ํ์ด๋ฅผ ๋ดค๊ณ , ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
(2) ์ ๋๋ก ๋ ํ์ด
- ์ ์ ์ค์์
๊ฒฝ์ ์ง
๋ฅผ ํ๋ ๊ณ ๋ฅธ๋ค. ๊ฒฝ์ ์ง๊น์ง ๊ฐ์ด ๊ฐ ๋ ์ต์ ๋น์ฉ
+๊ฒฝ์ ์ง โ ์ดํผ์ง์ง ์ต์ ๋น์ฉ
+๊ฒฝ์ ์ง โ ๋ฌด์ง์ง ์ต์ ๋น์ฉ
์ค ์ต์ ๋น์ฉ ๋ฐํ
ํด๋น ํ์ด๊ฐ ์ ๋๋ก ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฒฝ์ ์ง๋ฅผ ํ๋๋ ์ ์ด ๊ฒฝ์ฐ
๋ถํฐ๊ฒฝ์ ์ง๋ฅผ ์ต๋ํ ํ์ฉํ ๊ฒฝ์ฐ
์ ๋น์ฉ์ ๋ชจ๋ ํ์ธํ ์ ์๋ค.
์๋ํ๋ฉด ๊ฒฝ์ ์ง๋์ถ๋ฐ์ง
,๋ฌด์ง์ง
,์ดํผ์น์ง
๋ชจ๋ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ๋ฌด์ง์ง์ด ๋ง์นจ ์ดํผ์น์ง ๊ฐ๋ ๋ฐฉํฅ์ด๋ผ ๋ฌด์ง์ง์์ ๋ฌด์ง ๋ด๋ ค์ฃผ๊ณ ํ์ ๊ทธ๋๋ก ํ๊ณ ์ง๊น์ง ๊ฐ๋ ๊ฒฝ์ฐ, ์ถ๋ฐ์ง๋ถํฐ ๋ฐ๋ก๋ฐ๋ก ํ์ ํ๊ณ ์ง๊ฐ๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
3. ์ฝ๋ ์๊ฐ ๐
(0) ์ฌ์ ์ง์
a. ๋ค์ต์คํธ๋ผ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ํ ์ดํด: ๊ธฐ๋ณธ์ ์ธ ๋ค์ต์คํธ๋ผ๋ง ์ฌ์ฉํ๋ฏ๋ก ๋ฐ๋ก ๋ค์ต์คํธ๋ผ ๊ฐ๋ ์ค๋ช ์ ํ์ง ์๊ฒ ๋ค. ๊ฐ๋ ์ด ๊ถ๊ธํ์ ๋ถ์ ๋ค์ ์ค๋ช ๋งํฌ๋ฅผ ์ฐธ์กฐํ์๊ธธ ๋ฐ๋๋ค. ๋ค์ต์คํธ๋ผ ๊ฐ๋ ์ค๋ช , ๋ค์ต์คํธ๋ผ ๊ตฌํ ์ค๋ช
(1) ์ ์ฒด ์ฝ๋
import java.io.*;
import java.util.*;
class Solution {
static ArrayList<Vertex> [] lists;
public int solution(int n, int s, int a, int b, int[][] fares) {
// 0. initialize
lists = new ArrayList [n+1];
for(int i = 1; i < lists.length; i++){
lists[i] = new ArrayList<>();
}
for(int i = 0; i <fares.length; i++){
int start = fares[i][0];
int end = fares[i][1];
int weight = fares[i][2];
lists[start].add(new Vertex(end, weight));
lists[end].add(new Vertex(start, weight));
}
// 1. actual calculation
int [] togther = dijstra(s);
int ans = 0;
for(int i = 1; i <= n; i++){
int [] alone = dijstra(i);
ans = Math.min(ans, togther[i]+alone[a]+alone[b]);
}
return ans;
}
public int [] dijstra(int start){
PriorityQueue<Vertex> pq = new PriorityQueue<>((o1,o2) -> o1.cost - o2.cost);
int [] dist = new int [lists.length];
Arrays.fill(dist, Integer.MAX_VALUE);
pq.add(new Vertex(start, 0));
dist[start] = 0;
while(!pq.isEmpty()){
Vertex now = pq.poll();
if(now.cost > dist[now.idx]) continue;
for(int i = 0; i < lists[now.idx].size(); i++){
int nv = lists[now.idx].get(i).idx;
int nDist = dist[now.idx] + lists[now.idx].get(i).cost; // (ํ์ฌ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ + ํ ์ ์ ์์ nv๊น์ง์ ๊ฐ์ ๋น์ฉ)
if(dist[nv] > nDist){
dist[nv] = nDist;
pq.add(new Vertex(nv, nDist));
}
}
}
return dist;
}
}
class Vertex {
int idx;
int cost;
public Vertex (int idx, int cost){
this.idx = idx;
this.cost = cost;
}
}
(3) ํด์ฒด ๋ถ์
a. togther[] ๋ฐฐ์ด
: ํด๋น ๋ฐฐ์ด์ ์ถ๋ฐ์งโ ๊ฒฝ์ ์ง
๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด์ ๋ฐฐ์ด์ด๋ค. ๊ฐ ๋ฐฐ์ด์ index๊ฐ ๊ฒฝ์ ์ง๊ฐ ๋ ์ ์ ์ ๋ฒํธ์ด๊ณ , value๋ ํด๋น ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ์ด๋ค.
b. alone[] ๋ฐฐ์ด
: ๊ฒฝ์ ์ง i๋ฅผ ์ ํ๊ณ ๊ฑฐ๊ธฐ์๋ถํฐ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด์ด๋ค. ์ด๋ ํผ์์ ํ์ํ๊ณ ๊ฐ๋ ๋น์ฉ์ ๋ปํ๋ค.
c.ans
: together[i] + alone[a] + alone[b]
์ด๋ค. i๋ ๊ฒฝ์ ์ง๊น์ง ๊ฐ ๋น์ฉ + ๋ฐ๋ก ๊ฐ ๋น์ฉ๋ค์ ํฉ ์ด๋ค. i๋ ์ถ๋ฐ์ง๋ ๋ฌผ๋ก ์ด๊ณ ๋ฌด์ง์ง, ์ดํผ์น์ง ๋ค ๋ ์ ์์ด์, ๋ฐ๋ก ์์ธ์ฒ๋ฆฌ ์ํด๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ค ๋ค์ฌ๋ค ๋ณผ ์ ์๋ค.
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
๋ค์ต์คํธ๋ผ ํ์ฉ๋ฒ์ ๋ํ ์์ผ๊ฐ ํธ์ธ ๊ฒ ๊ฐ๋ค.