์ด๊ฑฐ ๋ถ๋ช
์ด๋์ ๋ณธ ๋ด์ฉ์ด๊ธธ๋ ๋
๋ค ์๋ํด๋ดค๋ค. ํ์ธํด๋ณด๋ ์ปจ๋ฒก์ค ํ ๋ฌธ์ ํ๋๋ฐ์ ์ํ์๋๋ผ.. ์๊ฐ๋ณด๋ค ์ธ์๊น์ ์๊ณ ๋ฆฌ์ฆ์ด์๋๋ณด๋ค. ๋ค์์ฃผ์ ๋์ฟ๊ฐ๋ค... ์คํค๋ ํ๊น ๋ง๊น ๊ณ ๋ฏผ์ค! ํ๋ค๊ฐ ์ฌ๊ณ ๋ด์ ํ์ฐํ๋๊ฑด ์๋์ง..
๊ตํํ์์ด ๊ณง ๋๋์ ์ง๊ธ์ ํด์ผํ ๊ฒ ๋ง๋ค... ์๋ฅ๋ง๊ณ , ํํ๋ง๊ณ , ๋ฐํ๋ง๋ค...๋ฐํ์ค๋น...๐ฅฒ
๋ฌธ์
https://www.acmicpc.net/problem/7420
๋ฌธ์ ์ดํด
- ๊ฑด๋ฌผ๋ค์ด ์ฃผ์ด์ง๊ณ ์ด ๊ฑด๋ฌผ๋ค์ ํฌํจํ๋ ๋ฐฉ๋ฒฝ์ ์ง๋๋ค. → ์ปจ๋ฒก์ค ํ์ด๋ค.
- ๋ฐฉ๋ฒฝ์ ๊ฑด๋ฌผ๋ค๊ณผ L ๊ฑฐ๋ฆฌ ์ด์ ๋จ์ด์ ธ์์ด์ผํ๋ค. → ์ปจ๋ฒก์ค ํ ์ ๊ฒฐ๊ณผ์์ L ๊ฑฐ๋ฆฌ์ฉ ๋ํ๋ค?
- ๋ฐฉ๋ฒฝ์ ์ต์๊ธธ์ด๋ ๋ฌด์์ธ๊ฐ.
์ฝ๋ ์ค๋ช
- ์ด๋ฐ์ ํ๋ฆฐ ๋ถ๋ถ
1. ์ปจ๋ฒก์ค ํ์์ L ๋งํผ์ x,y์ ๊ฐ๊ฐ ๋ํ๊ฑฐ๋ ๋นผ์ ํฝ์ฐฝ์ํด → ์ด๋ ๊ฒ ํ๋ฉด ์ต์ ๊ธธ์ด๋ณด๋ค ๋ ๋์ด. → ๊ฐ ๊ฐ๋์ ๋ํ ํธ๋ฅผ ๊ณ์ฐํด ๋ํ๊ธฐ๋ง ํ๋ฉด๋จ..

2. ๊ฐ๋ ๊ธฐ์ค ์ ๋ ฌ์ ํ ๋, ๊ธฐ์ค์ ๊ณผ ํจ๊ป ์ ๋ ฌํด๋ฒ๋ ค์ ์์. → ๊ธฐ์ค์ ์ ์คํ์์ ์ ๊ฑฐํ๊ณ ์งํํจ.
|
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;
public class B_7420 {
static class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
static int crossProduct(Point p, Point q, Point r) {
return (q.x - p.x) * (r.y - p.y) - (q.y - p.y) * (r.x - p.x);
}
}
static int distance(Point p1, Point p2) {
return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
}
static List<Point> grahamScan(List<Point> points) {
if (points.size() < 3)
return points;
Point start = points.get(0);
for (Point p : points) {
if (p.y < start.y || (p.y == start.y && p.x < start.x))
start = p;
}
Point finalStart = start;
points.remove(start);
points.sort((p1, p2) -> {
long cp = Point.crossProduct(finalStart,p1,p2);
if (cp == 0)
return Long.compare(distance(finalStart, p1), distance(finalStart, p2));
return cp > 0 ? -1 : 1;
});
Stack<Point> stack = new Stack<>();
stack.push(finalStart);
for (Point p : points) {
while (stack.size() > 1 && Point.crossProduct(stack.get(stack.size() - 2), stack.peek(), p) <= 0) {
stack.pop();
}
stack.push(p);
}
return new ArrayList<>(stack);
}
static double Line(List<Point> hull) {
double line = 0;
int n = hull.size();
for (int i = 0; i < n; i++) {
Point a = hull.get(i);
Point b = hull.get((i + 1) % n);
double dx = b.x - a.x;
double dy = b.y - a.y;
double length = Math.sqrt(dx * dx + dy * dy);
line += length;
}
return line;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int L = Integer.parseInt(st.nextToken());
List<Point> points = new ArrayList<>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
points.add(new Point(x, y));
}
List<Point> hull = grahamScan(points);
double straightLength = Line(hull);
double cornerLength = 2 * Math.PI * L;
System.out.println(Math.round(straightLength + cornerLength));
}
}
|
cs |
'Coding > ๋ฐฑ์ค ๋ฌธ์ ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| (ํ์ด์ฌ) ๋ฐฑ์ค 4991๋ฒ : ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2026.01.09 |
|---|---|
| (JAVA) ๋ฐฑ์ค 3197๋ฒ : ๋ฐฑ์กฐ์ ํธ์ (0) | 2024.10.07 |
| (JAVA) ๋ฐฑ์ค 3085๋ฒ : ์ฌํ ๊ฒ์ (0) | 2024.03.12 |
| (JAVA) ๋ฐฑ์ค 10026๋ฒ : ์ ๋ก์์ฝ (0) | 2023.04.03 |
| (ํ์ด์ฌ) ๋ฐฑ์ค 2839๋ฒ : ์คํ ๋ฐฐ๋ฌ (0) | 2022.07.21 |
Comment