[Boj_14431] ์†Œ์ˆ˜๋งˆ์„

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

โ–ธ ๋ฌธ์ œ

์†Œ์ˆ˜ ๋งˆ์„๋“ค์˜ ์ฃผ๋ฏผ๋“ค์€ ๋งค์šฐ ํŠน์ดํ•œ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•œ๋‹ค. ๊ทœ์น™์€ ๋ฐ”๋กœ “๊ฐ€๊ณ  ์‹ถ์€ ์œ„์น˜๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์†Œ์ˆ˜์ผ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ„๋‹ค”๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์†Œ์ˆ˜ ๋งˆ์„์˜ ์ฃผ๋ฏผ ์Šน์šฑ์ด๋Š” ์†Œ์ˆ˜ ๋งˆ์„์—์„œ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ A๋งˆ์„์— ๋ณผ์ผ์ด ์žˆ์–ด ๊ทธ๊ณณ๊นŒ์ง€ ๊ฐ€์•ผํ•œ๋‹ค. ์†Œ์ˆ˜ ๋งˆ์„์—์„œ A๋งˆ์„๊นŒ์ง€์˜ ๋‹จ์ˆจ์— ๊ฐ€๊ณ  ์‹ถ์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ๋‘ ๋งˆ์„์˜ ๊ฑฐ๋ฆฌ๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋Ÿด ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ทธ๋Ÿด ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅธ ๋งˆ์„๋“ค์„ ๊ฒฝ์œ ํ•˜์—ฌ ๊ฐ€์•ผํ•œ๋‹ค. (๊ฒฝ์œ ํ•˜๋Š” ๋งˆ์„๋„ ํ˜„์žฌ ์œ„์น˜์—์„œ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์†Œ์ˆ˜์ผ ๊ฒฝ์šฐ์—๋งŒ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.) ์†Œ์ˆ˜ ๋งˆ์„๊ณผ ๊ฒฝ์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์„๋“ค, ๊ทธ๋ฆฌ๊ณ  A๋งˆ์„์˜ ์œ„์น˜๊ฐ€ ์ขŒํ‘œํ‰๋ฉด ์ƒ์œผ๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์Šน์šฑ์ด๊ฐ€ ์†Œ์ˆ˜ ๋งˆ์„์˜ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ A๋งˆ์„๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ์˜ ๊ธธ์„ ์ฐพ๋Š” ๊ฒƒ์„ ๋„์™€์ฃผ์ž. ์†Œ์ˆ˜ ํŒ์ •์„ ์œ„ํ•ด ๋งˆ์„ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋Š” ์ •์ˆ˜ ๋ถ€๋ถ„๋งŒ์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฑฐ๋ฆฌ๊ฐ€ 3.1415๋ผ๋ฉด ์ด๋ฅผ ๋ฒ„๋ฆผํ•˜์—ฌ 3๋งŒ ์ทจ๊ธ‰ํ•œ๋‹ค.

 

โ–ธ ์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ์†Œ์ˆ˜ ๋งˆ์„์˜ ์œ„์น˜ (X1,Y1)์™€ A๋งˆ์„์˜ ์œ„์น˜ (X2,Y2)๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์— ๊ฒฝ์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์„์˜ ๊ฐœ์ˆ˜ N (0 ≤ N ≤ 4000)๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. ์„ธ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N+2๋ฒˆ์งธ ์ค„๊นŒ์ง€ ๊ฒฝ์œ  ํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์„๋“ค์˜ ์œ„์น˜ (X3,Y3)๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. ๋‹จ, ๊ฐ ๋งˆ์„๋“ค์˜ ์ขŒํ‘œ๋Š” ์ ˆ๋Œ“๊ฐ’์ด 3000์„ ๋„˜์ง€ ์•Š๋Š” ์ •์ˆ˜์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์†Œ์ˆ˜ ๋งˆ์„์˜ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ A๋งˆ์„๊นŒ์ง€ ๊ฐ€๋Š” ๋ฐฉ๋ฒ• ์ค‘ ์ œ์ผ ์งง์€ ๊ฑฐ๋ฆฌ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์˜ ๊ฑฐ๋ฆฌํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์†Œ์ˆ˜ ๋งˆ์„์˜ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒฝ์šฐ -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 3
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ์ˆ˜ํ•™, ๊ทธ๋ž˜ํ”„ ์ด๋ก , ์ •์ˆ˜๋ก , ์ตœ๋‹จ ๊ฒฝ๋กœ, ๋ฐ์ดํฌ์ŠคํŠธ๋ผ, ์†Œ์ˆ˜ ํŒ์ •, ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

์†Œ์ˆ˜ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

๋จผ์ €, ๋ชจ๋“  ์ •์ ๋“ค์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด์„œ, ๊ฑฐ๋ฆฌ๊ฐ€ ์†Œ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋งŒ ์ •์ ๋“ค์„ ์—ฐ๊ฒฐํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ฑฐ๋ฆฌ๊ฐ€ ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด ๋ฏธ๋ฆฌ ์†Œ์ˆ˜๋“ค์„ ๊ตฌํ•ด๋†“์•˜๋‹ค.

 

์—ฐ๊ฒฐํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

 

์ด๋•Œ, ๋„์ฐฉ์ ์ด๋ผ๋ฉด ๊ฑฐ๋ฆฌ๋ฅผ ๋ฆฌํ„ด

๋„์ฐฉ์ ์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋ฉด -1์„ ๋ฆฌํ„ดํ•œ๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 90480KB
์‹œ๊ฐ„ : 360ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int n;
    static ArrayList<Pos>[] arr;
    static public class Pos implements Comparable<Pos> {
        int end; int dist;
        public Pos (int end, int dist) {
            this.end = end; this.dist = dist;
        }
        @Override
        public int compareTo(Pos o) {
            return this.dist - o.dist;
        }
    }
    static final int INF = 987654321;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // ์—๋ผ์Šคํ† ํ…Œ๋„ค์Šค์˜ ์ฒด
        // ์†Œ์ˆ˜ X true, ์†Œ์ˆ˜ O false
        boolean[] isPrime = new boolean[12001];
        isPrime[0] = isPrime[1] = true;
        for (int i = 2; i <= Math.sqrt(12000); i++) {
            if (!isPrime[i]) {
                for (int j = i*i; j <= 12000; j += i) {
                    isPrime[j] = true;
                }
            }
        }

        StringTokenizer st = new StringTokenizer(br.readLine());
        // ์†Œ์ˆ˜ ๋งˆ์„์˜ ์œ„์น˜
        int sx = Integer.parseInt(st.nextToken());
        int sy = Integer.parseInt(st.nextToken());
        // A ๋งˆ์„์˜ ์œ„์น˜
        int ex = Integer.parseInt(st.nextToken());
        int ey = Integer.parseInt(st.nextToken());

        n = Integer.parseInt(br.readLine())+2; // ๊ฒฝ์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์„์˜ ๊ฐœ์ˆ˜ + ์‹œ์ž‘์ ๊ณผ ๋„์ฐฉ์ 

        arr = new ArrayList[n];
        for (int i = 0; i < n; i++) {
            arr[i] = new ArrayList<>();
        }

        ArrayList<int[]> list = new ArrayList<>();
        list.add(new int[]{sx, sy}); // ์‹œ์ž‘์ 
        for (int i = 0; i < n-2; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            list.add(new int[]{u, v});
        }
        list.add(new int[]{ex, ey}); // ๋„์ฐฉ์ 

        // ๋ชจ๋“  ์ •์  ๊ฐ„์˜ ๊ธธ์ด ๊ตฌํ•˜๊ธฐ - ์†Œ์ˆ˜์ธ ๊ฒฝ์šฐ๋งŒ ์—ฐ๊ฒฐ
        for (int i = 0; i < list.size(); i++) {
            for (int j = i+1; j < list.size(); j++) {
                int cost = (int)(Math.sqrt(Math.pow(list.get(i)[0] - list.get(j)[0], 2)
                        + Math.pow(list.get(i)[1] - list.get(j)[1], 2)));

                if (isPrime[cost]) continue; // ์†Œ์ˆ˜ X

                arr[i].add(new Pos(j, cost));
                arr[j].add(new Pos(i, cost));
            }
        }

        int ans = dijkstra();

        System.out.println(ans);
    }

    private static int dijkstra() {
        int[] dist = new int[n];
        Arrays.fill(dist, INF);

        PriorityQueue<Pos> pq = new PriorityQueue<>();
        pq.offer(new Pos(0, 0));
        dist[0] = 0;

        while (!pq.isEmpty()) {
            Pos now = pq.poll();

            if (now.dist > dist[now.end]) continue;

            // ๋„์ฐฉ์ ์ด๋ผ๋ฉด ๊ฑฐ๋ฆฌ ๋ฆฌํ„ด
            if (now.end == n-1) return dist[n-1];

            for (int i = 0; i < arr[now.end].size(); i++) {
                int nextEnd = arr[now.end].get(i).end;
                int nextDist = arr[now.end].get(i).dist;

                if (dist[nextEnd] > dist[now.end] + nextDist) {
                    dist[nextEnd] = dist[now.end] + nextDist;
                    pq.offer(new Pos(nextEnd, dist[nextEnd]));
                }
            }
        }

        return -1;
    }
}

 

ํ•ด๊ฒฐ ์™„๋ฃŒ ! ๐Ÿ”ฅ