๐ ๋ฌธ์ ๋งํฌ
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;
}
}
ํด๊ฒฐ ์๋ฃ ! ๐ฅ
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_14466] ์๊ฐ ๊ธธ์ ๊ฑด๋๊ฐ ์ด์ 6 (0) | 2025.01.11 |
---|---|
[Boj_12764] ์ธ์ง๋ฐฉ์ ๊ฐ ์คํ (0) | 2025.01.08 |
[Boj_11003] ์ต์๊ฐ ์ฐพ๊ธฐ (0) | 2024.12.17 |
[Boj_1497] ๊ธฐํ์ฝ์ํธ (3) | 2024.12.07 |
[Boj_1584] ๊ฒ์ (0) | 2024.11.29 |