upperBound && lowerBound --> binary search
π μ΄μ§ νμμμμ lowerBoundμ upperBound
| ν¨μ | μλ―Έ | 쑰건 | λ°νκ° |
|---|---|---|---|
lowerBound(arr, x) | x μ΄μ(β₯)μ 첫 μμΉ | arr[i] >= x | xκ° μ²μ λνλλ μμΉ λλ λ€μ΄κ° μμΉ |
upperBound(arr, x) | x μ΄κ³Ό(>)μ 첫 μμΉ | arr[i] > x | xλ³΄λ€ ν° κ°μ΄ μ²μ λνλλ μμΉ |
μ΄ λ ν¨μλ μ λ ¬λ λ°°μ΄μμ xμ κ°μ, μ½μ
μμΉ λ±μ λΉ λ₯΄κ² μ°Ύμ μ μλλ‘ ν΄μ£Όλ μ΄λΆ νμ κΈ°λ° λꡬμ
λλ€.
λ€μ μ¬μ§μ int[] my_cards μ΄λ€
λ΄κ° κ°κ³ μλ given_numbersλ₯Ό μλμ κ°λ€κ³ κ°μ νμ
1
int[] given_numbers = {17, 1, 2, 3, 4, -5};
μ¬κΈ°μ given_numbersμ ν΄λΉλλ μ«μμ κ°―μλ§νΌ μμλλ‘ μΆλ ₯νλ©΄ μ΄λ μλμ κ°μ΄ λμ¬ κ²μ΄λ€
1
{0, 1, 3, 2, 1, 0}
μ΄ κ·Έλ¦Όμ 보면 target_number == 2μΌ λ,
lowerBoundλ 첫 λ²μ§Έ 2κ° λμ€λ μΈλ±μ€μ μμΉνκ³ ,
upperBoundλ 2λ₯Ό μ΄κ³Όνλ μ«μμΈ 3μ 첫 λ²μ§Έ μΈλ±μ€μ μμΉνλ κ²μ λ³Ό μ μμ΅λλ€.
μ΄μ²λΌ κ° μ«μμ κ°μλ₯Ό ꡬνκ³ μ ν λλ upperBound - lowerBound μ°μ°μ ν΅ν΄ μ½κ² κ³μ°ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄ target_number == 17μ΄λΌλ©΄, lowerBoundμ upperBound λͺ¨λ κ°μ΄ μ‘΄μ¬νμ§ μκΈ° λλ¬Έμ 7μ΄λΌλ λμΌν μμΉλ₯Ό λ°νν©λλ€. μ¦,
java μ½λ λ³΅μ¬ upperBound - lowerBound = 7 - 7 = 0 μ΄ λμ΄ ν΄λΉ μ«μκ° λ°°μ΄μ μ‘΄μ¬νμ§ μμμ μ μ μμ΅λλ€. μ΄λ κ·Έλ¦Όμμλ 17μ΄ ν¬ν¨λμ΄ μμ§ μκΈ° λλ¬Έμ μμ°μ€λ½κ² μ΄ν΄ν μ μμ΅λλ€.
λ°±μ€ 10816 μ«μμΉ΄λ2
μ€μ μ°μ΅μΌλ‘ λ°±μ€ λ¬Έμ λ₯Ό νμ΄λ΄ μλ€ https://www.acmicpc.net/problem/10816
π‘μμ΄λμ΄
κ°μ΄ μ‘΄μ¬νμ§ μμ κ²½μ°, λ κ²½κ³ λͺ¨λ arr.lengthκ° λμ΄
1
upperBound - lowerBound = 0
μ΄ μλμΌλ‘ μ±λ¦½λκ² λ§λ λ€.
μ΄λ₯Ό μν΄ κ° ν¨μμμ res = arr.lengthλ‘ μ΄κΈ°νν©μλ€.
π§Ύ ν μ€νΈ μμ
1
2
3
4
5
6
7
8
9
# μμ μ
λ ₯ 2
10
6 3 2 10 10 10 -10 -10 7 3
8
10 17 -5 2 3 4 5 -10
# μΆλ ₯κ²°κ³Ό 2
3 0 0 1 2 0 0 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
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] N_arr = br.readLine().split(" ");
int[] my_cards = str_to_int(N_arr);
Arrays.sort(my_cards);
int M = Integer.parseInt(br.readLine());
String[] M_arr = br.readLine().split(" ");
int[] given_cards = str_to_int(M_arr);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < M ; i++) {
int target_num = given_cards[i];
int upper = upperBound(my_cards, target_num);
int lower = lowerBound(my_cards, target_num);
if (i < M-1) {
sb.append(upper - lower + " ");
}
else {
sb.append(upper - lower);
}
}
System.out.println(sb.toString().trim());
}
public static int upperBound(int[] my_cards, int target_num) {
int left = 0;
int right = my_cards.length - 1;
int res = my_cards.length;
while (left <= right) {
int mid = (left + right) / 2;
if (my_cards[mid] <= target_num) {
left = mid + 1;
}
else if (my_cards[mid] > target_num) {
res = mid;
right = mid - 1;
}
}
return res;
}
public static int lowerBound(int[] my_cards, int target_num) {
int left = 0;
int right = my_cards.length - 1;
int res = my_cards.length;
while (left <= right) {
int mid = (left + right) / 2;
if (my_cards[mid] < target_num) {
left = mid + 1;
}
else if (my_cards[mid] >= target_num) {
res = mid;
right = mid - 1;
}
}
return res;
}
public static int[] str_to_int(String[] arr) {
int[] res = new int[arr.length];
for (int i = 0; i < res.length; i++) {
res[i] = Integer.parseInt(arr[i]);
}
return res;
}
}


