parametric search
π Parametric Search (νλΌλ©νΈλ¦ μμΉ)
νλΌλ©νΈλ¦ μμΉλ μ΄λ€ 쑰건μ λ§μ‘±νλ βμ΅μ μ κ°(μ΅μ/μ΅λ)βμ μ΄μ§ νμμ ν΅ν΄ μ°Ύλ μκ³ λ¦¬μ¦μ
λλ€.
μ νν κ°μ μ°Ύλ μΌλ° μ΄μ§ νμκ³Ό λ¬λ¦¬, 쑰건μ λ§μ‘±νλ κ°μ₯ μμ κ° (λλ ν° κ°) μ μ°Ύλ λ°μ μ΄μ μ΄ μμ΅λλ€.
β νμ© μμ
- μ΅λνλλ‘ κ°λ₯ν μ΅μ λΉμ©, μ΅μνλλ‘ κ°λ₯ν μ΅λ 거리 λ±
- μ λ΅μ΄ μλλΌ μ λ΅μ΄ λ μ μλ βκ°μ λ²μβλ₯Ό μ΄λΆ νμν¨
- λν λ¬Έμ : μμ° λΆλ°°, 곡μ κΈ° μ€μΉ, λμ μλ₯΄κΈ° λ±
π§ λμ λ°©μ
- μΌλ°μ μΈ μ΄μ§ νμκ³Ό μ μ¬νμ§λ§,
midκ°μ΄ 쑰건μ λ§μ‘±νλμ§ νλ¨ β λ§μ‘±νλ©΄ λ λμ κ°μ΄ μλμ§ λ²μ μ‘°μ
π μμ
μ΄ 5λͺ
μ μ¬λμ΄ 50, 30, 40cmμ μΈλ¬μ€λ₯Ό μ νν λκ°μ μ¬μ΄μ¦λ‘ μλΌ ν λ©μ΄λ¦¬μ© λ°°λΆνλ €κ³ νλ€.
μ΅λ λͺ cmμΌλ‘ λλμ΄λ¨Ήμ μ μμκΉ?
1
μ λ΅ --> 20cm
μκ°ν΄λ³Ό κ²
- 5μΈλΆμΌλ‘ μ ννκ² λλ μ μμλ μ΅λκΈΈμ΄μΈκ°?
μ§νκ³Όμ μ μλμ κ°κ² λ€
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
β
λ§€κ°λ³μ νμ μ§ν κ³Όμ μ 리
[μ΄κΈ°]
left = 1, right = 50
[1νμ°¨]
mid = (1 + 50) / 2 = 25
canCut(25) β 4κ° β
right = 24
[2νμ°¨]
mid = (1 + 24) / 2 = 12
canCut(12) β 2 + 3 + 4 = 9κ° β
ans = 12, left = 13
[3νμ°¨]
mid = (13 + 24) / 2 = 18
canCut(18) β 1 + 2 + 2 = 5 β
ans = 18, left = 19
[4νμ°¨]
mid = (19 + 24) / 2 = 21
canCut(21) β 1 + 1 + 2 = 4 β
right = 20
[5νμ°¨]
mid = (19 + 20) / 2 = 19
canCut(19) β 1 + 2 + 2 = 5 β
ans = 19, left = 20
[6νμ°¨]
mid = (20 + 20) / 2 = 20
canCut(20) β 1 + 2 + 2 = 5 β
ans = 20, left = 21
[μ’
λ£]
left = 21 > right = 20 β break
μ΅μ’
ans = 20
μ λ΅ μ½λ
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
/*
μ΄ 5λͺ
μ μ¬λμ΄ μΈλ¬μ€λ₯Ό μ νν λκ°μ μ¬μ΄μ¦λ‘ μλΌ ν λ©μ΄λ¦¬μ© λ°°λΆνλ €κ³ νλ€.
μ΅λ λͺ cmμΌλ‘ λλμ΄λ¨Ήμ μ μμκΉ?
int[] churos = {50, 30, 40}
μ λ΅μ 20cm
*/
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Solution{
static int[] churos = {50, 30, 40};
static int people = 5;
static {
Arrays.sort(churos);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int res = parametric_search(churos, people);
System.out.println(res);
}
public static int parametric_search(int[] churos, int people) {
int left = 1;
int right = upperBound(churos);
int ans = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (canCut(churos, mid, people)) {
ans = mid;
left = mid + 1;
}
else {
right = mid - 1;
}
}
return ans;
}
public static boolean canCut(int[] churos, int mid, int people) {
int cnt = 0;
for (int i : churos) {
cnt += (i / mid);
}
return cnt >= people;
}
public static int upperBound(int[] arr) {
int max = 0;
for (int i : arr) {
if (i > max) {
max = i;
}
}
return max;
}
}
This post is licensed under CC BY 4.0 by the author.
