π Binary Search (μ΄μ§ νμ)
μ΄μ§ νμ(Binary Search)μ μ λ ¬λ λ°°μ΄μμ νΉμ κ°μ λΉ λ₯΄κ² μ°Ύλ μκ³ λ¦¬μ¦μ
λλ€.
νμ λ²μλ₯Ό μ λ°μ© μ€μ¬κ°λ©° μνλ κ°μ μ°ΎκΈ° λλ¬Έμ μκ° λ³΅μ‘λλ O(log N) μ
λλ€.
β
λμ 쑰건
- λ°°μ΄μ΄ λ°λμ μ€λ¦μ°¨μμΌλ‘ μ λ ¬λμ΄ μμ΄μΌ νλ€.
- μ λ ¬λμ§ μμ λ°°μ΄μμ μ΄μ§ νμμ μννλ©΄ μ νν κ²°κ³Όλ₯Ό 보μ₯ν μ μλ€.
β±οΈ μκ° λ³΅μ‘λ μ 리
| κ²½μ° | μκ° λ³΅μ‘λ | λΉκ΅ νμ (μ΅λ) | μ€λͺ
| |ββ|βββββ|ββββββ|ββ| | μ΅μ | O(1) | 1 | midκ° μ²μλΆν° targetμΌ λ | | νκ· | O(log N) | logβN | νμ λ²μλ₯Ό λ°λ³΅μ μΌλ‘ λ°μ© μ€μ | | μ΅μ
| O(log N) | logβN | κ°μ₯ λμ μκ±°λ μλ κ²½μ°κΉμ§ νμ |
π‘ Java μ½λ μμ
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
| import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] nums = {1, 3, 7, 13, 5, 9};
int target_num = 7;
// μ λ ¬λ λ°°μ΄μμ μ΄μ§ νμ μν
Arrays.sort(nums); // β λ°λμ μ λ ¬ νμ
int idx = binarySearch(nums, target_num);
if (idx != -1) {
System.out.println("μ°Ύμ idx : " + idx);
} else {
System.out.println("κ°μ λͺ» μ°Ύκ² λ€");
}
}
public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
return mid; // κ° μ°Ύμ
} else if (arr[mid] < target) {
left = mid + 1; // μ€λ₯Έμͺ½ νμ
} else {
right = mid - 1; // μΌμͺ½ νμ
}
}
return -1; // λͺ» μ°Ύμ
}
}
|
π‘ Java μ½λ μμ
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
| import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] nums = {1, 3, 7, 13, 5, 9};
int target_num = 7;
// μ λ ¬λ λ°°μ΄μμ μ΄μ§ νμ μν
Arrays.sort(nums); // β λ°λμ μ λ ¬ νμ
int idx = binarySearch(nums, target_num);
if (idx != -1) {
System.out.println("μ°Ύμ idx : " + idx);
} else {
System.out.println("κ°μ λͺ» μ°Ύκ² λ€");
}
}
public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
return mid; // κ° μ°Ύμ
} else if (arr[mid] < target) {
left = mid + 1; // μ€λ₯Έμͺ½ νμ
} else {
right = mid - 1; // μΌμͺ½ νμ
}
}
return -1; // λͺ» μ°Ύμ
}
}
|
π― Lower Bound & Upper Bound
lower_bound μ upper_boundλ μ λ ¬λ λ°°μ΄μμ νΉμ κ°μ κΈ°μ€μΌλ‘ κ²½κ³ μΈλ±μ€λ₯Ό μ°Ύλ μ΄μ§ νμμ λ³νμ
λλ€.
β
κ°λ
μ μ
| ν¨μ | μλ―Έ |
|---|
lower_bound | target μ΄μμ΄ μ²μ λμ€λ μμΉλ₯Ό λ°ν |
upper_bound | target μ΄κ³Όκ° μ²μ λμ€λ μμΉλ₯Ό λ°ν |
π λ λ€ κ°μ΄ μ‘΄μ¬νμ§ μλλΌλ, κ·Έ κ°μ΄ βλ€μ΄κ° μ μλ μ리βλ₯Ό λ°νν©λλ€.
μ¦, μ½μ
μμΉλ λ²μ κ΅¬κ° λ±μ νμ©λ©λλ€.
π§ μμ λ°°μ΄
1
| int[] arr = {1, 3, 3, 5, 7, 9};
|
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
| public class BoundsSearch {
// μ λ ¬λ λ°°μ΄μμ target μ΄μ 첫 μμΉ
public static int lowerBound(int[] arr, int target) {
int left = 0;
int right = arr.length;
while (left < right) {
int mid = (left + right) / 2;
if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
// μ λ ¬λ λ°°μ΄μμ target μ΄κ³Ό 첫 μμΉ
public static int upperBound(int[] arr, int target) {
int left = 0;
int right = arr.length;
while (left < right) {
int mid = (left + right) / 2;
if (arr[mid] <= target) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
public static void main(String[] args) {
int[] arr = {1, 3, 3, 5, 7, 9};
int target = 3;
int lb = lowerBound(arr, target);
int ub = upperBound(arr, target);
System.out.println("lower_bound(3): " + lb); // 1
System.out.println("upper_bound(3): " + ub); // 3
System.out.println("3μ κ°μ: " + (ub - lb)); // 2
}
}
|