b.9370 ๋ฏธํ™•์ธ ๋„์ฐฉ์ง€

2025. 3. 15. 19:34ยทAlgorithm & Data Structures/BOJ

 

https://www.acmicpc.net/problem/9370

 

 

 

๐Ÿ“Œ ์ž๋ฐ”(Java)๋กœ ํ‘ธ๋Š” ๋ฏธํ™•์ธ ๋„์ฐฉ์ง€ ๋ฌธ์ œ - ๋ฐฑ์ค€ 9370 ๐Ÿš—๐Ÿ“

 


๐Ÿ”Ž ๋ฌธ์ œ ๊ฐœ์š”

 

๋ฐฑ์ค€ 9370๋ฒˆ - ๋ฏธํ™•์ธ ๋„์ฐฉ์ง€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ถœ๋ฐœ์ง€(S)์—์„œ ๋ชฉ์ ์ง€ ํ›„๋ณด๋“ค ์ค‘,

ํŠน์ • ๋„๋กœ(G-H)๋ฅผ ๋ฐ˜๋“œ์‹œ ์ง€๋‚˜๋ฉด์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชฉ์ ์ง€๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•˜์—ฌ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 



๐Ÿ’ก ์˜ˆ์ œ ์ž…๋ ฅ

2
6 9 2
1 2 3
1 2 1
1 3 2
2 3 2
3 4 3
3 5 5
4 5 4
4 6 1
5 6 2
5
6

๐Ÿ’ก ์˜ˆ์ œ ์ถœ๋ ฅ

6
5 6

โžก ๋ชฉ์ ์ง€ ํ›„๋ณด ์ค‘ ํŠน์ • ๋„๋กœ(G-H)๋ฅผ ์ง€๋‚˜๋ฉด์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ์ถœ๋ ฅ

 



๐Ÿ›  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ‘๊ทผ ๋ฐฉ์‹

 

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Dijkstra) ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

โœ๏ธ ์ฃผ์š” ๊ณ ๋ ค ์‚ฌํ•ญ

 

โœ” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ 3๋ฒˆ ์‹คํ–‰

โœ” ์ถœ๋ฐœ์ง€(S)์—์„œ ๋ชจ๋“  ์ •์ ๊นŒ์ง€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ

โœ” G, H ์ •์ ์—์„œ ๊ฐ๊ฐ ๋‹ค์ต์ŠคํŠธ๋ผ ์‹คํ–‰ํ•˜์—ฌ ๊ฒฝ์œ  ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ

โœ” ์ถœ๋ฐœ์ง€ → ๋ชฉ์ ์ง€ ๊ฑฐ๋ฆฌ์™€, ํŠน์ • ๋„๋กœ(G-H)๋ฅผ ๊ฒฝ์œ ํ•œ ๋‘ ๊ฐ€์ง€ ๊ฑฐ๋ฆฌ ๋น„๊ต

โœ” ๋‘ ๊ฑฐ๋ฆฌ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ํ•ด๋‹น ๋ชฉ์ ์ง€๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒƒ

 



๐Ÿ”น Java ์ฝ”๋“œ ํ•ด์„ค

import java.io.*;
import java.util.*;

public class b9370 {

    static int T, N, M, D; // ๊ต์ฐจ๋กœ ์ˆ˜, ๋„๋กœ ์ˆ˜, ๋ชฉ์ ์ง€ ํ›„๋ณด ์ˆ˜
    static int S, G, H;   // ์ถœ๋ฐœ์ง€, G์™€ H ์‚ฌ์ด์˜ ๋„๋กœ๋ฅผ ์ง€๋‚˜๊ฐ
    static HashMap<Integer, ArrayList<Node>> graph;

    static class Node implements Comparable<Node> {
        int spot;
        int distance;

        public Node(int spot, int distance) {
            this.spot = spot;
            this.distance = distance;
        }

        @Override
        public int compareTo(Node o) {
            return Integer.compare(this.distance, o.distance);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        T = stringToInteger(br.readLine());

        for (int t = 0; t < T; t++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            N = stringToInteger(st.nextToken());
            M = stringToInteger(st.nextToken());
            D = stringToInteger(st.nextToken());

            st = new StringTokenizer(br.readLine());
            S = stringToInteger(st.nextToken());
            G = stringToInteger(st.nextToken());
            H = stringToInteger(st.nextToken());

            graph = new HashMap<>();
            for (int i = 1; i <= N; i++) graph.put(i, new ArrayList<>());

            int ghDistance = 0;
            for (int m = 0; m < M; m++) {
                st = new StringTokenizer(br.readLine());
                int a = stringToInteger(st.nextToken());
                int b = stringToInteger(st.nextToken());
                int d = stringToInteger(st.nextToken());
                graph.get(a).add(new Node(b, d));
                graph.get(b).add(new Node(a, d));

                if ((a == G && b == H) || (a == H && b == G)) ghDistance = d;
            }

            int[] distFromS = dijkstra(S);
            int[] distFromG = dijkstra(G);
            int[] distFromH = dijkstra(H);

            List<Integer> results = new ArrayList<>();
            for (int i = 0; i < D; i++) {
                int target = stringToInteger(br.readLine());
                int directDist = distFromS[target];

                // G-H ๊ฐ„์„ ์„ ๊ฒฝ์œ ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฝ๋กœ ๋น„๊ต
                int viaGH = distFromS[G] + ghDistance + distFromH[target];
                int viaHG = distFromS[H] + ghDistance + distFromG[target];

                if (directDist == viaGH || directDist == viaHG) {
                    results.add(target);
                }
            }

            Collections.sort(results);
            StringBuilder sb = new StringBuilder();
            for (int res : results) sb.append(res).append(" ");
            System.out.println(sb);
        }
    }

    private static int[] dijkstra(int s) {
        int[] dist = new int[N + 1];
        Arrays.fill(dist, Integer.MAX_VALUE);
        dist[s] = 0;
        PriorityQueue<Node> pq = new PriorityQueue<>();
        pq.add(new Node(s, 0));

        while (!pq.isEmpty()) {
            Node cur = pq.poll();
            int curSpot = cur.spot;
            int curDist = cur.distance;

            if (dist[curSpot] < curDist) continue;

            for (Node next : graph.get(curSpot)) {
                int newDist = curDist + next.distance;
                if (newDist < dist[next.spot]) {
                    dist[next.spot] = newDist;
                    pq.add(new Node(next.spot, newDist));
                }
            }
        }
        return dist;
    }

    private static int stringToInteger(String s) {
        return Integer.parseInt(s);
    }
}

 

 



๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

 

๐Ÿ“Œ 1. ๊ทธ๋ž˜ํ”„ ์ž…๋ ฅ ๋ฐ ์ดˆ๊ธฐํ™”

graph = new HashMap<>();
for (int i = 1; i <= N; i++) graph.put(i, new ArrayList<>());

int ghDistance = 0;
for (int m = 0; m < M; m++) {
    int a = stringToInteger(st.nextToken());
    int b = stringToInteger(st.nextToken());
    int d = stringToInteger(st.nextToken());
    graph.get(a).add(new Node(b, d));
    graph.get(b).add(new Node(a, d));

    if ((a == G && b == H) || (a == H && b == G)) ghDistance = d;
}

• ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(graph)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„๋ฅผ ์ €์žฅ

• ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ ์–‘์ชฝ(a-b & b-a) ์ถ”๊ฐ€

• ํŠน์ • ๋„๋กœ(G-H)์˜ ๊ฑฐ๋ฆฌ(ghDistance) ์ €์žฅ

 



๐Ÿ“Œ 2. ๋‹ค์ต์ŠคํŠธ๋ผ ์‹คํ–‰

int[] distFromS = dijkstra(S);
int[] distFromG = dijkstra(G);
int[] distFromH = dijkstra(H);

• ์ถœ๋ฐœ์ง€(S), G, H์—์„œ ๊ฐ๊ฐ ๋‹ค์ต์ŠคํŠธ๋ผ ์‹คํ–‰

• ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด(dist[])์„ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅ

 



๐Ÿ“Œ 3. ๋ชฉ์ ์ง€ ํ›„๋ณด ํ•„ํ„ฐ๋ง

for (int i = 0; i < D; i++) {
    int target = stringToInteger(br.readLine());
    int directDist = distFromS[target];

    int viaGH = distFromS[G] + ghDistance + distFromH[target];
    int viaHG = distFromS[H] + ghDistance + distFromG[target];

    if (directDist == viaGH || directDist == viaHG) {
        results.add(target);
    }
}

• ์ถœ๋ฐœ์ง€ → ๋ชฉ์ ์ง€ ๊ฑฐ๋ฆฌ์™€ G-H๋ฅผ ์ง€๋‚˜๊ฐ€๋Š” ๊ฑฐ๋ฆฌ ๋น„๊ต

• ๊ฒฝ๋กœ๊ฐ€ ๋™์ผํ•˜๋ฉด results ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€

 



๐Ÿ“Œ 4. ์ตœ์ข… ๊ฒฐ๊ณผ ์ถœ๋ ฅ

Collections.sort(results);
StringBuilder sb = new StringBuilder();
for (int res : results) sb.append(res).append(" ");
System.out.println(sb);

• ๊ฒฐ๊ณผ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ›„ ์ถœ๋ ฅ

 



๐Ÿ† ์ •๋ฆฌ

 

โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ

 

โœ” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ 3๋ฒˆ ์‹คํ–‰ํ•˜์—ฌ ๊ฒฝ์œ  ๊ฒฝ๋กœ ํ™•์ธ

โœ” ์ถœ๋ฐœ์ง€ → ๋ชฉ์ ์ง€ ๊ฑฐ๋ฆฌ์™€ G-H ๊ฒฝ์œ  ๊ฒฝ๋กœ ๋น„๊ต

โœ” O((N + M) log N) ๋ณต์žก๋„๋กœ ์ตœ์ ํ™”๋œ ๊ฒฝ๋กœ ํƒ์ƒ‰

 

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด ์ข‹์•„์š”์™€ ๊ณต์œ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿ˜Š

 

 

'Algorithm & Data Structures > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

b.11657 ํƒ€์ž„๋จธ์‹   (0) 2025.03.20
b1956. ์šด๋™  (0) 2025.03.20
b.1707 ์ด๋ถ„ ๊ทธ๋ž˜ํ”„  (0) 2025.03.12
b24445. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ 2  (1) 2025.03.06
b24444. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ 1  (0) 2025.03.04
'Algorithm & Data Structures/BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • b.11657 ํƒ€์ž„๋จธ์‹ 
  • b1956. ์šด๋™
  • b.1707 ์ด๋ถ„ ๊ทธ๋ž˜ํ”„
  • b24445. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ 2
Geisha
Geisha
๊ฐœ๋ฐœ ์ผ๊ธฐ
  • Geisha
    Geisha
    Geisha
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (335)
      • Algorithm & Data Structures (253)
        • BOJ (111)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (29)
        • SQL (23)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • ์šด์˜์ฒด์ œ (13)
        • ๋„คํŠธ์›Œํฌ (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    dfs
    ๋™์ ๊ณ„ํš๋ฒ•
    Union-Find
    DynamicProgramming
    ์ „์œ„์ˆœํšŒ
    Dijkstra
    ๊ฒฝ๋กœ์••์ถ•
    Stack
    SQL
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    ๋ฐฑ์ค€
    dp
    Java
    ๋‹ค์ต์ŠคํŠธ๋ผ
    binarySearch
    ์Šคํƒ
    ๋ฐฑํŠธ๋ž˜ํ‚น
    ํˆฌํฌ์ธํ„ฐ
    programmers
    ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ
    ์ด๋ถ„ํƒ์ƒ‰
    PriorityQueue
    BFS
    ๊ณจ๋“œ
    ๊ตฌํ˜„
    algorithm
    ์ž๋ฐ”
    ํ›„์œ„์ˆœํšŒ
    baekjoon
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Geisha
b.9370 ๋ฏธํ™•์ธ ๋„์ฐฉ์ง€
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”