๐ก ๋ฌธ์
๋ฌธ์ ์ค๋ช
[๋ณธ ๋ฌธ์ ๋ ์ ํ์ฑ๊ณผ ํจ์จ์ฑ ํ ์คํธ ๊ฐ๊ฐ ์ ์๊ฐ ์๋ ๋ฌธ์ ์ ๋๋ค.]
๋ฐค๋ฆ๊ฒ ๊ท๊ฐํ ๋ ์์ ์ ์ํด ํญ์ ํ์๋ฅผ ์ด์ฉํ๋ ๋ฌด์ง๋ ์ต๊ทผ ์ผ๊ทผ์ด ์ฆ์์ ธ ํ์๋ฅผ ๋ ๋ง์ด ์ด์ฉํ๊ฒ ๋์ด ํ์๋น๋ฅผ ์๋ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๊ณ ์์ต๋๋ค. "๋ฌด์ง"๋ ์์ ์ด ํ์๋ฅผ ์ด์ฉํ ๋ ๋๋ฃ์ธ ์ดํผ์น ์ญ์ ์์ ๊ณผ ๋น์ทํ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ํ์๋ฅผ ์ข ์ข ์ด์ฉํ๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. "๋ฌด์ง"๋ "์ดํผ์น"์ ๊ท๊ฐ ๋ฐฉํฅ์ด ๋น์ทํ์ฌ ํ์ ํฉ์น์ ์ ์ ํ ์ด์ฉํ๋ฉด ํ์์๊ธ์ ์ผ๋ง๋ ์๋ ์ ์์ ์ง ๊ณ์ฐํด ๋ณด๊ณ "์ดํผ์น"์๊ฒ ํฉ์น์ ์ ์ํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ ์์ ๊ทธ๋ฆผ์ ํ์๊ฐ ์ด๋ ๊ฐ๋ฅํ ๋ฐ๊ฒฝ์ ์๋ 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๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋๋ค.
๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/72413
๐ก ๋ฌธ์ ํ์ด
Dijkstra ์ ํ๊ณผ distance(๊ฑฐ๋ฆฌ ๋ฐฐ์ด)์ ๊ธฐ์ค์ ๋ง ์ ์๊ฐํด๋ด๋ฉด ๋๋ฆ ์ฝ๊ฒ ํ ์ ์๋ ๋ฌธ์ ์๋ค.
๊ธฐ์ค์ ์ ์๊ฐํ๊ธฐ ์ด๋ ค์ ๋๋ฐ, ์๊ณ ๋ณด๋ ๋ฌด์ง(A)์ ์ดํผ์น(B)๊ฐ ํฉ์นํ๋ ์ข ๋ฃ์ง์ ์ ๊ธฐ์ค์ ์ผ๋ก ๋๋ฉด ๋ฐ๋ก ํด๊ฒฐ๋์๋ค.
๊ฐ์ ์ข ๋ฃ์ง์ i์ ๋ํด์, "S > i ๊ฑฐ๋ฆฌ" + "A > i ๊ฑฐ๋ฆฌ" + "B > i ๊ฑฐ๋ฆฌ"์ ์ต์๊ฐ์ ๊ตฌํด์ฃผ๋ฉด ๋๋ค.
โญ๏ธ ์ ์ฒด ์ฝ๋
import java.util.*;
class Solution {
class Edge implements Comparable<Edge> {
int num;
int cost;
Edge (int num, int cost) {
this.num = num;
this.cost = cost;
}
@Override
public int compareTo(Edge e) {
return this.cost - e.cost; // ์ ์ ๋น์ฉ๋ถํฐ ์ ๋ ฌ
}
}
List<List<Edge>> graph = new ArrayList<>(); // ๊ฒฝ๋ก ์ ์ฅ ๊ทธ๋ํ
public int solution(int n, int s, int a, int b, int[][] fares) {
initGraph(n); // ๊ทธ๋ํ ์ด๊ธฐํ
updateGraph(fares); // ๊ทธ๋ํ์ ๊ฒฝ๋ก ์ ์ฅ
// ์ต์ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด
int[] distanceS = dijkstra(s, n); // S์ง์ ์ด ์ถ๋ฐ์
int[] distanceA = dijkstra(a, n); // A์ง์ ์ด ์ถ๋ฐ์
int[] distanceB = dijkstra(b, n); // B์ง์ ์ด ์ถ๋ฐ์
int answer = Integer.MAX_VALUE; // ์ต์ ๋น์ฉ ๊ฐ
for (int i = 1; i <= n; i++) {
if (impossible(distanceS[i], distanceA[i], distanceB[i])) {
// ํ ์ง์ ์ด๋ผ๋ Integer.MAX_VALUE ๊ฐ์ด๋ฉด ๋ถ๊ฐ๋ฅํ ๊ฒฝ๋ก์ด๋ฏ๋ก ๊ณ ๋ ค X
continue;
}
answer = Math.min(answer, distanceS[i] + distanceA[i] + distanceB[i]);
}
return answer;
}
private int[] dijkstra (int start, int n) {
int[] distance = new int[n + 1];
Arrays.fill(distance, Integer.MAX_VALUE);
distance[start] = 0;
Queue<Edge> pq = new PriorityQueue<>();
pq.add(new Edge(start, 0));
while (!pq.isEmpty()) {
Edge now = pq.poll();
for (Edge next : graph.get(now.num)) {
if (distance[next.num] > distance[now.num] + next.cost) {
distance[next.num] = distance[now.num] + next.cost;
pq.add(new Edge(next.num, distance[next.num]));
}
}
}
return distance;
}
private boolean impossible(int s, int a, int b) {
return s == Integer.MAX_VALUE || a == Integer.MAX_VALUE || b == Integer.MAX_VALUE;
}
private void initGraph(int n) {
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
}
private void updateGraph(int[][] fares) {
for (int[] fare : fares) {
graph.get(fare[0]).add(new Edge(fare[1], fare[2]));
graph.get(fare[1]).add(new Edge(fare[0], fare[2]));
}
}
}