-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathDH_43236.java
More file actions
57 lines (45 loc) · 1.79 KB
/
DH_43236.java
File metadata and controls
57 lines (45 loc) · 1.79 KB
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
import java.util.*;
class DH_43236 {
public int solution(int distance, int[] rocks, int n) {
int answer = 0;
int s = 0, e = distance;
Arrays.sort(rocks);
// 각 지점 사이의 최소 거리를 조절하면서 정답 구하기
while(s <= e) {
int m = (s + e) / 2;
// 최소 길이가 middle가 될 수 있을 때
// 제거해야되는 최소 돌의 개수
int tmp = removeCnt(rocks, m, distance);
// 제거해야되는 돌의 개수가 주어진 값보다 같거나 작으면
// 현재 값이 작아서 다른 큰 값들이 많다는 의미
// 현재 값의 크기를 키워줘야 됨
if(tmp <= n) {
answer = m;
s = m + 1;
// 제거해야 되는 돌의 개수가 주어진 값보다 크다면
// 해당 값보다 작은 값들이 많아서 작은 거리을 없애기 위해 돌을 많이 없애야 된다는 의미
// 현재 값을 줄여줘야 됨
} else {
e = m - 1;
}
}
return answer;
}
// 제거해야되는 바위 개수 세는 함수
static int removeCnt(int[] rocks, int m, int distance) {
// mid가 바위 간 최소 거리가 되어야 함
int removeCnt = 0;
int before = 0;
for(int i = 0; i < rocks.length + 1; i++) {
int current = i == rocks.length ? distance: rocks[i];
// 두 지점 사이 간격이 m보다 작다면 해당 바위 제거해야 됨
if(current - before < m) {
removeCnt++;
continue;
}
if(i == rocks.length) break;
before = rocks[i];
}
return removeCnt;
}
}