์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ํ์ ๋ถ๊ธฐ
- ๋ฐฐ์ด
- Java
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์์
- Flutter
- programmers
- ์คํ๋ง
- ํ์ด์ฌ
- ํ์ด์ฝ ์น๊ตฌ์ฝ๋
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ 3ํ
- php
- ์ต๋จ ๊ฒฝ๋ก
- ํ์ด์ฝ ์ด๋์ฝ๋
- C
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์ฐ์ต๋ฌธ์
- ํ์ด์ฝ ์ถ์ฒ์ธ์ฝ๋
- C์ธ์ด
- SWEA
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ
- ํ๋ฌํฐ
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ๋ฌธ์ ํ์ด
- php ํ๋ก๊ทธ๋๋ฐ
- ์๋ฐ ์คํ๋ง
- ๋ฐฑ์ค
- spring
- ํ์ด์ฝ ์ถ์ฒ์ธ
- JAVA SPRING
- ํ๋ฌํฐ ๊ฐ๋ฐํ๊ฒฝ ์ค์
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์๋ฃจ์
- ์๋ฐ
- Today
- Total
ImJay
[BOJ/Java] 3628. Knockdown ๋ณธ๋ฌธ
๐๐ฅ [BOJ/Java] 3628. Knockdown ๐ฃ๐ฅ
๐ ๋ฌธ์ ๋งํฌ
๐ ๋ฌธ์ ํด์
์ด ๋ฌธ์ ๋ ์ ์ธ๊ณ๋ฅผ ํ๊ดดํ๊ธฐ ์ํด ํน์ ์ง์ ์ ํญํ์ ๋ฐฐ์นํ๋ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃฌ๋ค. ๐๐ฃ
๊ฐ ํญํ์ ๋์ผํ ํ๊ดด ๋ฐ๊ฒฝ์ ๊ฐ์ง๋ฉฐ, ์ ์ธ๊ณ๋ฅผ ํ๊ดดํ ์ ์๋ ์ต์ํ์ ๋ฐ๊ฒฝ์ ์ฐพ์์ผ ํ๋ค. ๐โก๏ธ๐ฅ
์ง๊ตฌ๋ ๋ฐ์ง๋ฆ์ด 1์ธ ๋จ์ ๊ตฌ(Sphere) ๋ก ๋ชจ๋ธ๋ง๋๋ฉฐ, ํญํ์ ์์น๋ ์๋(latitude, φ)์ ๊ฒฝ๋(longitude, λ) ๋ก ์ฃผ์ด์ง๋ค.
๊ฑฐ๋ฆฌ๋ ๊ตฌ๋ฉด ๊ฑฐ๋ฆฌ(Spherical Distance) ๋ก ์ธก์ ๋๋ค. ๐๐
๐ง ํ์ด ๊ณผ์
1๏ธโฃ ๊ตฌ ์ขํ ๋ณํ (์๋/๊ฒฝ๋ → 3D ์ขํ) ๐บ๏ธโก๏ธ๐ธ
์ง๊ตฌ๋ ๊ตฌํ์ด๋ฏ๋ก, ์ฃผ์ด์ง ์๋์ ๊ฒฝ๋๋ฅผ 3D ์ขํ๊ณ๋ก ๋ณํํด์ผ ํ๋ค.
์๋(φ)์ ๊ฒฝ๋(λ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๊ณต์์ ์ด์ฉํ๋ค.
x = cos(φ) * cos(λ)
y = cos(φ) * sin(λ)
z = sin(φ)
์ด์ ๊ฐ ํญํ์ 3D ๊ณต๊ฐ์ ์ (Point) ์ผ๋ก ๋ณํ๋๋ค. ๐๏ธ๐
2๏ธโฃ ์ต์ ๋ฐ๊ฒฝ์ ์ฐพ๊ธฐ ์ํ ์ ๊ทผ ๋ฐฉ์ ๐๐ฏ
๋ชฉํ๋ ์ด๋ ์ง์ ์์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ํญํ๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ์ต์ ๋ฐ๊ฒฝ r ์ดํ๊ฐ ๋๋๋ก ํ๋ ๊ฒ์ด๋ค.
์ฆ, ์ง๊ตฌ์์ ๋ชจ๋ ์ ์ด ์ด๋ค ํญํ๊ณผ๋ ์ต๋ r ๊ฑฐ๋ฆฌ ์ด๋ด์ ์๋๋ก ๋ณด์ฅํด์ผ ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์ด๋ถ ํ์(์ด์ง ํ์) + ๊ธฐํํ์ ๊ณ์ฐ์ ํ์ฉํ๋ค. โ๏ธ๐งฎ
๐น ๊ณ ๋ คํด์ผ ํ ํ๋ณด ์ ๋ค
- ๊ฐ ํญํ์ ๋ฐ๋ํธ ์ (Antipodal Point)
- ํญํ์ด ์์นํ ์ ์ ์ ๋ฐ๋ ์ง์ ์ด ์ ๋ ฅํ ํ๋ณด๊ฐ ๋๋ค.
- ์ด๋ (−x,−y,−z)(-x, -y, -z) ๋ก ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
- ๋ ํญํ ์ฌ์ด์ ์ค๊ฐ์ (Pairwise Midpoint)
- ๋ ๊ฐ์ ํญํ์ด ์๋ค๋ฉด, ์ด๋ค์ ์ค๊ฐ ๋ฒกํฐ ๋ฐฉํฅ์ด ์ ์ ํ ํ๋ณด๊ฐ ๋ ์ ์๋ค.
- ์ธ ํญํ์ผ๋ก ์ด๋ฃจ์ด์ง ์ ์ (Triple-wise Normal Vector)
- ์ธ ๊ฐ์ ํญํ์ด ํ์ฑํ๋ ํ๋ฉด์ ๋ฒ์ ๋ฒกํฐ๊ฐ ์ ๋ ฅํ ํ๋ณด๊ฐ ๋๋ค.
๐น ์ต์ ํ ๋ชฉํ: min max(dot product)
๊ฐ ํ๋ณด ์ง์ ์์ ๋ชจ๋ ํญํ๊ณผ์ ์ต๋ ๋ด์ (dot product) ๊ฐ์ ์ต์ํํ๋ p๋ฅผ ์ฐพ์์ผ ํ๋ค.
์ด ๊ฐ์ด ์์์๋ก ์ต์ ์ ๋ฐ๊ฒฝ์ด ์ค์ด๋ ๋ค.
์ต์ ๋ฐ๊ฒฝ์ acos(์ต์ ์ ๋ด์ ๊ฐ) ์ผ๋ก ๊ณ์ฐ๋๋ค.
r = arccos(min max(p · bomb_i))
๐ป ์ฝ๋ ๊ตฌํ (Java)
import java.io.*;
import java.util.*;
public class Main {
static final double EPS = 1e-9; // ์ค์ฐจ ํ์ฉ ๋ฒ์
// 3์ฐจ์ ์ขํ๋ฅผ ์ ์ฅํ๋ ํด๋์ค
static class Point {
double x, y, z;
Point(double x, double y, double z) {
this.x = x; this.y = y; this.z = z;
}
Point add(Point p) { return new Point(x + p.x, y + p.y, z + p.z); }
Point subtract(Point p) { return new Point(x - p.x, y - p.y, z - p.z); }
Point multiply(double s) { return new Point(x * s, y * s, z * s); }
double dot(Point p) { return x * p.x + y * p.y + z * p.z; } // ๋ด์
Point cross(Point p) { // ์ธ์
return new Point(y * p.z - z * p.y,
z * p.x - x * p.z,
x * p.y - y * p.x);
}
double norm() { return Math.sqrt(x * x + y * y + z * z); } // ๋ฒกํฐ ํฌ๊ธฐ
Point normalize() { // ๋จ์ ๋ฒกํฐ ๋ณํ
double n = norm();
if(n < EPS) return new Point(0, 0, 0);
return new Point(x / n, y / n, z / n);
}
}
static double candidateValue(Point p, Point[] bombs) {
double val = -1e9;
for (Point b : bombs) {
val = Math.max(val, p.dot(b));
}
return val;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out);
int n = Integer.parseInt(br.readLine().trim());
Point[] bombs = new Point[n];
for (int i = 0; i < n; i++) {
String[] parts = br.readLine().trim().split("\\s+");
double lat = Math.toRadians(Double.parseDouble(parts[0]));
double lon = Math.toRadians(Double.parseDouble(parts[1]));
double cosLat = Math.cos(lat);
bombs[i] = new Point(cosLat * Math.cos(lon), cosLat * Math.sin(lon), Math.sin(lat));
}
double best = 1e9;
for (int i = 0; i < n; i++) {
Point cand = new Point(-bombs[i].x, -bombs[i].y, -bombs[i].z);
best = Math.min(best, candidateValue(cand, bombs));
}
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
Point sum = bombs[i].add(bombs[j]);
if (sum.norm() > EPS) {
best = Math.min(best, candidateValue(sum.multiply(-1).normalize(), bombs));
}
}
}
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
for (int k = j+1; k < n; k++) {
Point cross = bombs[i].subtract(bombs[j]).cross(bombs[i].subtract(bombs[k]));
if (cross.norm() > EPS) {
best = Math.min(best, candidateValue(cross.normalize(), bombs));
best = Math.min(best, candidateValue(cross.multiply(-1).normalize(), bombs));
}
}
}
}
best = Math.max(-1, Math.min(1, best));
double ans = Math.acos(best);
out.printf("%.6f\n", ans);
out.flush();
}
}
โณ ์๊ฐ ๋ณต์ก๋ ๋ถ์
- ๊ฐ ํญํ๋ง๋ค ํ๋ณด ํ์ → O(n)
- ๋ ๊ฐ์ ํญํ์ ์ด์ฉํ ํ๋ณด ํ์ → O(n^2)
- ์ธ ๊ฐ์ ํญํ์ ์ด์ฉํ ํ๋ณด ํ์ → O(n^3)
- ์ต๋ ํญํ ๊ฐ์ n=20n = 20 ์ด๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ O(8000), ์ถฉ๋ถํ ์คํ ๊ฐ๋ฅ โ
๐ก ๋๋ ์
โ
๊ตฌ๋ฉด ๊ธฐํํ๊ณผ ์ด๋ถ ํ์์ ์กฐํฉํ ํฅ๋ฏธ๋ก์ด ๋ฌธ์ ์๋ค! ๐โจ
โ
ํญํ์ด ์ต์ํ์ผ๋ก ์ปค๋ฒํด์ผ ํ ๋ฒ์๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด ๊ธฐํํ์ ์ผ๋ก ์ฌ๋ฏธ์์๋ค. ๐ฏ๐ฅ
โ
๋ฒกํฐ ์ฐ์ฐ(๋ด์ , ์ธ์ , ๋จ์ ๋ฒกํฐ ๋ณํ) ์ ์ค์์ฑ์ ๋ค์ ํ๋ฒ ์ฒด๊ฐํ๋ค! ๐
'์๊ณ ๋ฆฌ์ฆ > BOJ - Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/Java] 12422. ์ฐฝ๋ฌธ ๊นจ๊ธฐ (Large) (1) | 2025.03.14 |
---|---|
[BOJ/Java] 6902. Orko (1) | 2025.03.13 |
[BOJ/Java] 5266. Strange Dream (0) | 2025.03.13 |
[BOJ/Java] 11404. ํ๋ก์ด๋ (1) | 2025.03.10 |
[BOJ/Java] 2931. ๊ฐ์ค๊ด (0) | 2025.03.10 |