๐Ÿš•ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค : ํƒ์‹œ ํ•ฉ์Šน

๊ธ๊ธยท2025๋…„ 11์›” 23์ผ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
26/31

๋ฌธ์ œ

ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ
๋‘ ์‚ฌ๋žŒ(A์™€ B)์ด ๊ฐ™์€ ์ถœ๋ฐœ์ง€ S์—์„œ ์ถœ๋ฐœํ•ด์„œ ๊ฐ์ž์˜ ๋ชฉ์ ์ง€ A, B๊นŒ์ง€ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.
๋ชจ๋“  ์ง€์  ๊ฐ„ ์ด๋™ ๋น„์šฉ์ด ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ์„ ๋•Œ,

  • ์ค‘๊ฐ„ ์ง€์ ๊นŒ์ง€ ํ•ฉ์Šน ํ›„ ๊ฐˆ๋ผ์ง€๊ธฐ

  • ํ˜น์€ ์•„์˜ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋”ฐ๋กœ ์ด๋™ํ•˜๊ธฐ

์ด ๋‘˜ ์ค‘ ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ๊ฒŒ ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ด ํƒ์‹œ์š”๊ธˆ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ.

ํ’€์ด ์ ‘๊ทผ

์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ์ด๊ณ , ํ•ฉ์Šน ์ข…๋ฃŒ ์ง€์  ์ด๋ผ๋Š” '์ค‘๊ฐ„ ์ง€์ '์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,
๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๋‚˜์˜ ์•„์ด๋””์–ด

๋ฌธ์ œ์—์„œ ์ถœ๋ฐœ์ง€๋Š” A, B๋กœ ๋‘ ๊ฐœ์ด๊ณ 
๋„์ฐฉ์ง€์ ์€ S๋กœ ํ•˜๋‚˜์ด๋‹ค.
๊ทธ๋ž˜์„œ ๋„์ฐฉ์ง€์  S์—์„œ ์ถœ๋ฐœํ•˜์—ฌ A, B๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๊ฐ๊ฐ ๊ตฌํ•˜๋ฉด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์ด 3๋ฒˆ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ๋Œ๋ฆฐ๋‹ค
1.s์—์„œ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€ ์ตœ์†Œ ๋น„์šฉ ๋ฐฐ์—ด -> dist[]
2.s์—์„œ A๊นŒ์ง€ ์ตœ์†Œ ๋น„์šฉ ๊ตฌํ•จ -> dist[]
3.s์—์„œ A๊นŒ์ง€ ์ตœ์†Œ ๋น„์šฉ ๊ตฌํ•จ -> dist[]

๊ทธ๋ฆฌ๊ณ  ํ•ฉ์Šนํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ตœ์†Œ ๋น„์šฉ๊ณผ ๋”ฐ๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•œ๋‹ค์Œ, ๋‘˜ ์ค‘ ์ž‘์€ ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.

gpt ์•„์ด๋””์–ด

gpt์—๊ฒŒ ๋ฌผ์–ด๋ณด๋‹ˆ ๋‚ด๊ฐ€ ์„ค๊ณ„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ 3๋ฒˆ ๋‹ค์ต์ŠคํŠธ๋ผ ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฐ™์ง€๋งŒ, ๊ฒฐ๊ณผ๋ฅผ ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์ด 3๊ฐœ์˜ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ๋Œ๋ฆฐ๋‹ค.
1.s์—์„œ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€ ์ตœ์†Œ ๋น„์šฉ ๋ฐฐ์—ด -> dist[]
2.A์—์„œ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€ ์ตœ์†Œ ๋น„์šฉ ๋ฐฐ์—ด -> dist[]
3.B์—์„œ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€ ์ตœ์†Œ ๋น„์šฉ ๋ฐฐ์—ด -> dist[]

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด K๋ฅผ ํ™˜์Šน์ง€์ ์œผ๋กœ ๋Œ๋ฆฌ๊ณ  ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋ฉด ๋์ด๋‹ค.

answer = min( distS[k] + distA[k] + distB[k] )   for k = 1..n

์ •๋ฆฌํ•˜์ž๋ฉด, ๋ชจ๋“  ์ ์„ ํ™˜์Šนํ›„๋ณด๋กœ ๋‘๊ณ  ์ตœ์†Œ ๋น„์šฉ์ด ๋‚˜์˜ค๋Š” ํ™˜์Šน ์ง€์ ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

์ฝ”๋“œ๋กœ ์ •๋ฆฌํ•˜๊ธฐ

1.๋„์ฐฉ์ง€์ ๊ณผ ๋น„์šฉ์„ ์ €์žฅํ•  ํด๋ž˜์Šค ์ƒ์„ฑ

๋น„์šฉ์ด ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— compareTo๋„ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

class Node implements Comparable<Node> {
	int to;
    int cost;
    
    Node (int to, int cost) {
    	this.to = to;
        this.cost = cost;
    }
    
    @Override
    public int compareTo(Node o){
    	return this.cost - o.cost;
    }
}

2. ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑํ•˜๊ณ  ๋„์ฐฉ์ง€์ , ๊ฐ€๊ฒฉ ์ €์žฅํ•˜๊ธฐ

List<List<Node>> graph = new ArrayList<>();
for (int i = 0; i <= n; i++) {
	graph.add(new ArrayList<>());
}

//์–‘๋ฐฉํ–ฅ์œผ๋กœ ๊ทธ๋ž˜ํ”„ ๊ตฌ์„ฑ
for (int [] f : fares){
	int from = f[0];
    int to = f[1];
    int cost = f[2];
    
    graph.get(from).add(new Node(to, cost)));
    graph.get(to).add(new Node(from, cost)));
}

3. ๋‹ค์ต์ŠคํŠธ๋ผ ํ•จ์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ

private int[] dijkstra(int strat, int n, List<List<Node>> graph){
	//์šฐ์„ ์ˆœ์œ„ ํ ์ƒ์„ฑ
  	PriorityQueue<Node> pq = new PriorityQueue<>();
    //์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•  ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด ์ƒ์„ฑ
    int[] dist = new int[n + 1];
    //์ดˆ๊ธฐ๊ฐ’์„ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ธฐ
    Arrays.fill(dist.INF);
    //์‹œ์ž‘์ง€์ ์˜ ๊ฑฐ๋ฆฌ๋Š” 0์œผ๋กœ
    dist[start] = 0;
    //์‹œ์ž‘์ง€์ ์˜ ๊ฐ์ฒด ๋„ฃ๊ธฐ 
    pq.offer(new Node(start, 0));
    
    while(!pq.isEmpty()){
    	Node now = pq.poll();
        //ํ˜„์žฌ์˜ ๊ฐ’์ด ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๋„˜์–ด๊ฐ€๊ธฐ
        //now.cost : ํ˜„์žฌ ์ง€์ ์—์„œ now.to๊นŒ์ง€์˜ ๋น„์šฉ (๋ฐ”๋กœ ์ด์–ด์ง„ ๊ฒฝ์šฐ์˜ ๋น„์šฉ)
        //dist[now.to] : ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๋น„์šฉ
        if (now.cost > dist[now.to]) continue;
        
        //ํ˜„์žฌ ์ง€์ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ง€์ ์„ ํƒ์ƒ‰ํ•˜๊ธฐ
        for (Node next : graph.get(now.to)){
        //ํ˜„์žฌ๊นŒ์ง€ ์˜ค๋Š” ๋ฐ ๋“  ๋น„์šฉ + ์ธ์ ‘ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ = ์ƒˆ๋กœ์šด ํ›„๋ณด ๋น„์šฉ
        	int newCost = now.cost + next.cost;
            //๋งŒ์•ฝ ํ˜„์žฌ ์•Œ๊ณ  ์žˆ๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ณด๋‹ค ์ƒˆ๋กœ ๊ณ„์‚ฐํ•œ ๋น„์šฉ์ด ๋” ์ž‘๋‹ค๋ฉด
            if (newCost < dist[next.to]){
            //์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•œ๋‹ค.
            	dist[next.to] = newCost;
                pq.offer(new Node(next.to, newCost));
            }
        }
    }
    return dist;
  }

4. ๊ฐ€์žฅ ๋น„์šฉ์ด ์‹ผ ํ•ฉ์Šน ์ง€์  ํƒ์ƒ‰ํ•˜๊ธฐ

    int[] distS = dijkstra(s, n, graph);
      int[] distA = dijkstra(a, n, graph);
      int[] distB = dijkstra(b, n, graph);

      int answer = INF;

      // ์ค‘๊ฐ„ ํ•ฉ์Šน ์ง€์  k(1~n) ํƒ์ƒ‰
      for (int k = 1; k <= n; k++) {
          long total = (long)distS[k] + distA[k] + distB[k];
          answer = (int)Math.min(answer, total);
      }

      return answer;

๋‹ค์ต์ŠคํŠธ๋ผ ์ •๋ฆฌ

์ด ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ ... ์ฝ”๋“œ ํ๋ฆ„์„ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.
๋‹ค์ต์ŠคํŠธ๋ผ ์ •๋ฆฌ

์ „์ฒด ์ฝ”๋“œ

import java.util.*; //import ์จ์ฃผ๊ธฐ

class Node implements Comparable<Node>{
  int to;
  int cost;
  
  public Node(int to, int cost) {
      this.to = to;
      this.cost = cost;
  }
  
  @Override
  public int compareTo(Node o) {
      return this.cost - o.cost;
  }
}


class Solution {
  static final int INF = Integer.MAX_VALUE; //์ด๊ฒƒ๋„ ์ฒดํฌ
  static List<List<Node>> graph;
  static int N;
  
  public int solution(int n, int s, int a, int b, int[][] fares) {
      N = n;
      
      graph = new ArrayList<>();
      for (int i = 0; i <= n; i ++) {
          graph.add(new ArrayList<>());
      }
      
      for (int i = 0; i < fares.length; i++) {
          int from = fares[i][0];
          int to = fares[i][1];
          int cost = fares[i][2];
          graph.get(from).add(new Node(to, cost));
          graph.get(to).add(new Node(from, cost));
      }
      
      //s -> ๋ชจ๋“  ์ง€์ ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ 
      //a -> ๋ชจ๋“ ์ง€์ 
      //b -> ๋ชจ๋“  ์ง€์ 
      int[] dist_s = dijstra(s);
      int[] dist_a = dijstra(a);
      int[] dist_b = dijstra(b);
      
      int min_fare = INF;
      for (int k = 1; k <= n ; k ++) {
          min_fare = Math.min(min_fare, dist_s[k] + dist_a[k] + dist_b[k]);
      }

      return min_fare;
  }
  
  //start์—์„œ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ์†Œ๊ฑฐ๋ฆฌ
public int[] dijstra(int start) {
  PriorityQueue<Node> pq = new PriorityQueue<>();
  int[] dist = new int[N + 1];
  Arrays.fill(dist, INF); //์ด๊ฒƒ๋„ ํ™•์ธ Array.๋ฅผ ์จ์•ผ ํ•œ๋‹ค
  dist[start] = 0;
  pq.offer(new Node(start, 0));
  
  while(!pq.isEmpty()) {
      Node curr = pq.poll();
      if (curr.cost > dist[curr.to]) continue;
      
      for (Node next : graph.get(curr.to)) {
          int new_cost = curr.cost + next.cost;
          if (new_cost < dist[next.to]) { //์กฐ๊ฑด์„ ๊ฑธ์–ด์„œ ๋งŒ์กฑํ•  ๊ฒฝ์šฐ์—๋งŒ ํ์— ๋„ฃ์–ด์•ผ ํ•จ
              dist[next.to] = new_cost;
              pq.offer(new Node(next.to, new_cost));
          }
      }
  }
  return (dist);
}


  
}

0๊ฐœ์˜ ๋Œ“๊ธ€