[LeetCode] Path with Maximum Probability ๐Ÿงฎ (Java)

hoonssacยท2025๋…„ 6์›” 28์ผ

Coding test

๋ชฉ๋ก ๋ณด๊ธฐ
8/9
post-thumbnail

๐Ÿงฉ ๋ฌธ์ œ ํŒŒ์•…

  • ๋ฐฉํ–ฅ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • start_node์—์„œ end_node๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ ์ค‘ ์„ฑ๊ณต ํ™•๋ฅ ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฒฝ๋กœ์˜ ํ™•๋ฅ ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ.
  • ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋Š” 0๊ณผ 1์‚ฌ์ด์˜ ํ™•๋ฅ ๊ฐ’.
  • ๊ฒฝ๋กœ๊ฐ€ ์—†์œผ๋ฉด 0.0 ๋ฐ˜ํ™˜
  • ํ™•๋ฅ ์˜ ํ•ฉ์ด ์•„๋‹ˆ๋ผ ๊ณฑ์„ ๊ตฌํ•ด์•ผ ํ•จ!

๐ŸŽฏ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

๊ทธ๋ž˜ํ”„ ํ‘œํ˜„ : ์ธ์ ‘๋ฆฌ์ŠคํŠธ

  • Map<Integer, List<Edge>> graph๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ํ‘œํ˜„.
  • graph.get(u).add(new Edge(v, w)) , graph.get(v).add(newEdge(u, w))๋กœ ์–‘๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  • Edge ํด๋ž˜์Šค๋Š” node ์™€ prob๋ฅผ ์ €์žฅํ•œ๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์‚ฌ์šฉํ•ด ์ตœ๋Œ€ ํ™•๋ฅ  ๊ฒฝ๋กœ ๊ตฌํ•˜๊ธฐ

  • โ€œ๊ณฑ์˜ ๊ฐ’์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฒฝ๋กœโ€๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ํ™•๋ฅ ์˜ ๊ณฑ์ด ํฐ ๊ฒฝ๋กœ๋ถ€ํ„ฐ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰.
  • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๊ตฌ์„ฑ โ†’ ํ™•๋ฅ ์ด ํฐ ๊ฒƒ๋ถ€ํ„ฐ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์Œ.
    Queue<Edge> pq = new PriorityQueue<>((a, b) -> Double.compare(b.prob, a.prob));

๊ฑฐ๋ฆฌ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”

  • dist[node]๋Š” start_node์—์„œ node๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋†’์€ ํ™•๋ฅ ์„ ์ €์žฅ.
  • ์ฒ˜์Œ์—๋Š” Arrays.fill(dist, 0)์œผ๋กœ ์ดˆ๊ธฐํ™”.
  • start_node์˜ ํ™•๋ฅ ์€ 1๋กœ ์„ค์ •ํ•˜์—ฌ ์‹œ์ž‘.

๋‹ค์ต์ŠคํŠธ๋ผ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ

  • ์šฐ์„  ์ˆœ์œ„ ํ์—์„œ ํ˜„์žฌ ๋…ธ๋“œ curr๋ฅผ ๊บผ๋‚ด์„œ, ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ์„ ์ˆœํšŒํ•œ๋‹ค.
    • ํ˜„์žฌ ๋…ธ๋“œ๊นŒ์ง€์˜ ํ™•๋ฅ  dist[curr.node]๊ณผ ํ˜„์žฌ ๊ฐ„์„ ์˜ ํ™•๋ฅผ next.prob์„ ๊ณฑํ•ด
    • ํ•ด๋‹น ๋…ธ๋“œ๊นŒ์ง€์˜ ์ƒˆ๋กœ์šด ํ™•๋ฅ  nextDist๋ฅผ ๊ตฌํ•œ๋‹ค.
  • ๋งŒ์•ฝ dist[next.node] < nextDist์ด๋ผ๋ฉด,
    • ๋” ๋†’์€ ํ™•๋ฅ  ๊ฒฝ๋กœ๋ฅผ ์ฐพ์€ ๊ฒƒ์ด๋ฏ€๋กœ, ๊ฐฑ์‹ ํ•˜๊ณ  pq์— ์‚ฝ์ž…ํ•˜์—ฌ ๋‹ค์Œ ํƒ์ƒ‰์„ ์˜ˆ์•ฝํ•œ๋‹ค.
  • ์ด ๊ณผ์ •์„ ํ†ตํ•ด ํ™•๋ฅ ์˜ ๊ณฑ์ด ๊ฐ€์žฅ ๋†’์€ ๊ฒฝ๋กœ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ ๊ฐ€์žฅ ๋†’์€ ํ™•๋ฅ ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค!

์ตœ์ข… ๋ฐ˜ํ™˜

  • dist[end_node]๊ฐ€ start_node์—์„œ end_node๊นŒ์ง€ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋†’์€ ํ™•๋ฅ ์ด๋ฏ€๋กœ, ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๊ฒฝ๋กœ๊ฐ€ ์—†์œผ๋ฉด dist[end_node]๋Š” ์—ฌ์ „ํžˆ 0์ด๋ฏ€๋กœ, ๋ฌธ์ œ ์กฐ๊ฑด์— ๋งž๊ฒŒ 0.0์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

๐ŸŒŸ ์ฝ”๋“œ ๊ตฌํ˜„

class Solution {

    // ๊ฐ„์„ (Edge) ํด๋ž˜์Šค: ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ๋ฒˆํ˜ธ์™€ ํ•ด๋‹น ๊ฐ„์„ ์˜ ์„ฑ๊ณต ํ™•๋ฅ ์„ ๊ฐ€์ง
    class Edge {
        int node;       // ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ๋ฒˆํ˜ธ
        double prob;    // ์„ฑ๊ณต ํ™•๋ฅ 

        Edge(int node, double prob) {
            this.node = node;
            this.prob = prob;
        }
    }

    public double maxProbability(int n, int[][] edges, double[] succProb, int start_node, int end_node) {
        // ๊ทธ๋ž˜ํ”„ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
        Map<Integer, List<Edge>> graph = new HashMap<>();
        for (int i = 0; i < n; i++) {
            graph.put(i, new ArrayList<>()); // ๋…ธ๋“œ๋ณ„ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
        }

        // ๊ฐ„์„  ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ทธ๋ž˜ํ”„ ๊ตฌ์ถ• (๋ฌด๋ฐฉํ–ฅ)
        for (int i = 0; i < edges.length; i++) {
            int u = edges[i][0];     // ์ถœ๋ฐœ ๋…ธ๋“œ
            int v = edges[i][1];     // ๋„์ฐฉ ๋…ธ๋“œ
            double w = succProb[i];  // ์„ฑ๊ณต ํ™•๋ฅ 

            // ์–‘๋ฐฉํ–ฅ ๊ฐ„์„  ์ถ”๊ฐ€
            graph.get(u).add(new Edge(v, w));
            graph.get(v).add(new Edge(u, w));
        }

        // ํ™•๋ฅ  ๋ฐฐ์—ด (dist): start_node์—์„œ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋Œ€ ํ™•๋ฅ  ์ €์žฅ
        double[] dist = new double[n];
        Arrays.fill(dist, 0); // ์ดˆ๊ธฐ๊ฐ’: 0

        // ์šฐ์„ ์ˆœ์œ„ ํ (ํ™•๋ฅ ์ด ํฐ ๋…ธ๋“œ๋ถ€ํ„ฐ ๊บผ๋‚ด๋„๋ก ๋‚ด๋ฆผ์ฐจ์ˆœ ์„ค์ •)
        Queue<Edge> pq = new PriorityQueue<>((a, b) -> Double.compare(b.prob, a.prob));

        // start_node์—์„œ ์‹œ์ž‘, ํ™•๋ฅ ์€ 1
        pq.offer(new Edge(start_node, 1));
        dist[start_node] = 1;

        // ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
        while (!pq.isEmpty()) {
            Edge curr = pq.poll(); // ํ˜„์žฌ ๋…ธ๋“œ์™€ ํ˜„์žฌ๊นŒ์ง€์˜ ํ™•๋ฅ  ๊ฐ€์ ธ์˜ค๊ธฐ

            // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ™•์ธ
            for (Edge next : graph.get(curr.node)) {
                double nextDist = dist[curr.node] * next.prob; // ํ˜„์žฌ ํ™•๋ฅ  * ๊ฐ„์„  ํ™•๋ฅ  = ๋‹ค์Œ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ์ƒˆ๋กœ์šด ํ™•๋ฅ 

                // ๋” ๋†’์€ ํ™•๋ฅ  ๊ฒฝ๋กœ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๊ฐฑ์‹ 
                if (dist[next.node] < nextDist) {
                    pq.add(new Edge(next.node, nextDist)); // ๋‹ค์Œ ๋ฐฉ๋ฌธ ์˜ˆ์•ฝ
                    dist[next.node] = nextDist;            // ํ™•๋ฅ  ๊ฐฑ์‹ 
                }
            }
        }

        // end_node๊นŒ์ง€์˜ ์ตœ๋Œ€ ํ™•๋ฅ  ๋ฐ˜ํ™˜
        return dist[end_node];
    }
}
profile
ํ›ˆ์‹น์˜ ๊ฐœ๋ฐœ์—ฌํ–‰

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