μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
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 |
- ꡬν
- SQL
- λ°±μ€
- λ€μ΄λλ―Ήνλ‘κ·Έλλ°
- μμνμ
- 그리λ
- λμ κ³νλ²
- λ°μ΄ν°λ² μ΄μ€
- DFS
- BFS
- DP
- λλΉμ°μ νμ
- νλ‘κ·Έλλ¨Έμ€
- κΉμ΄μ°μ νμ
- ν°μ€ν 리μ±λ¦°μ§
- μ λ ¬
- db
- μλ£κ΅¬μ‘°
- λ³ν©μ λ ¬
- μ°μ μμν
- μκ³ λ¦¬μ¦
- LIS
- λμ ν©
- νμ΄μ¬
- κ·Έλννμ
- μ€λΈμ
- μν
- λ¨Έμ§μνΈ
- κ·Έλν
- μμꡬνκΈ°
πππ°πΈ π£πΆπ΅ π΄π΅π¦π’π₯πΊ
[μκ³ λ¦¬μ¦] μ΄λΆ νμ(Binary Search) λ³Έλ¬Έ
1. μ΄λΆ νμ ; Binary Search
1.1 κ°λ
λ²μλ₯Ό μ μ μ’νκ°λ©° νμμ νλ μκ³ λ¦¬μ¦μΌλ‘, μ΄μ§ νμμ΄λΌκ³ λ νλ€. νλμ© μ°Ύλ κ²μ΄ μλ leftμ right μμͺ½μμ νμμ νκΈ° λλ¬Έμ μΌλ° νμμ λΉν΄ μλκ° λΉ λ₯΄λ€. μκ°λ³΅μ‘λλ μΌλ° νμμ΄ O(n), μ΄λΆ νμμ΄ O(log n)μ΄λ€.
μκ³ λ¦¬μ¦μ΄ μλνλ λ°©μμ λ€μκ³Ό κ°λ€.
- 미리 μ λ ¬λ λ°°μ΄μμ, μ ν΄λμ μΈλ±μ€ μμΉμΈ leftμ rightλ‘ mid κ°μ μ ν΄μ€(mid = (left + right) / 2)
- midκ° κ°λ¦¬ν€λ κ°κ³Ό λͺ©ν κ°(result)μ λΉκ΅νλ€.
- mid > result, right = mid - 1
midκ° κ°λ¦¬ν€λ κ°λ³΄λ€ λͺ©ν κ°μ΄ λ μμ κ²½μ°, λͺ©ν κ°μ΄ μ λ° μλμͺ½μ ν¬ν¨λ λ²μ μμ λ€μ΄μκΈ° λλ¬Έμ rightλ₯Ό mid - 1λ‘ μ€μ - mid < result, left = mid + 1
midκ° κ°λ¦¬ν€λ κ°λ³΄λ€ λͺ©ν κ°μ΄ λ ν΄ κ²½μ°, λͺ©ν κ°μ΄ μ λ° μμͺ½ λ²μ μμ ν¬ν¨λ λ²μ μμ λ€μ΄μκΈ° λλ¬Έμ leftλ₯Ό mid + 1λ‘ μ€μ
- mid > result, right = mid - 1
- left > right κ° λ λ κΉμ§, νΉμ λͺ©ν κ°μ μ°Ύμ λ κΉμ§ 1~3 λ°λ³΅
μμ μ€λͺ ν 1κ³Ό κ°μ΄, νμνλ λ°°μ΄μ λ°λμ 미리 μ λ ¬μ΄ λμ΄μμ΄μΌ νλ€.
μμλ₯Ό 보면 μ΄ν΄κ° μ½λ€.
미리 μ λ ¬λ λ°°μ΄ A = { 1, 2, 3, 4, 5, 6, 7, 8 } μμ μ°Ύκ³ μ νλ κ°μ΄ 7μΌλ, μ΄λΆ νμ κ³Όμ μ λ€μκ³Ό κ°λ€.
μ΄ λ, μ΄κΈ° left = 1, right = 8μ΄λ€.
1λ¨κ³ : mid = (left + right) / 2 μ μν΄ mid = 4κ° λκ³ , A[4]μ μ°Ύλ λͺ©ν κ° 7μ λΉκ΅νμμ λ, A[4] < 7μ΄κΈ° λλ¬Έμ leftλ₯Ό mid + 1μΈ 5λ‘ μ€μ νλ€.
2λ¨κ³ : mid = (5 + 8) / 2 = 6μ΄ λκ³ , A[6]κ³Ό μ°Ύλ λͺ©ν κ° 7μ λΉκ΅νμμ λ, A[6] < 7μ΄κΈ° λλ¬Έμ leftλ₯Ό 7λ‘ μ€μ νλ€.
3λ¨κ³ : mid = (7 + 8) / 2 = 7μ΄ λκ³ , A[7]κ³Ό μ°Ύλ λͺ©ν κ° 7μ λΉκ΅νμμ λ, A[7]κ³Ό κ°μ΄ μΌμΉνκΈ° λλ¬Έμ μ΄λΆ νμμ μ’ λ£νλ€.
1.2 μ½λ
μκ³ λ¦¬μ¦μ μ£Όμ μ½λλ λ€μκ³Ό κ°λ€.
int left = 0, right = N - 1;
int target, result;
while(left <= right) {
int mid = (left + right) / 2;
if(A[mid] == target) {
result = A[mid];
break;
}
else if(A[mid] < target) left = mid + 1;
else right = mid - 1;
}
μ΄λ₯Ό μ μ©ν μ 체 μ½λλ λ€μκ³Ό κ°λ€. Nκ°μ λ°°μ΄μ μ λ ₯λ°μ μ λ ¬νκ³ , νκ²μ μ λ ₯λ°μ λ€, νκ²μ μ°Ύμ λ κΉμ§ μ΄λΆ νμμ μ€ννλ€.
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
int main(void) {
int N;
scanf("%d", &N);
vector<int> A;
for(int i = 0; i < N; i++) {
int temp;
scanf("%d", &temp);
A.push_back(temp);
}
sort(A.begin(), A.end()); // μ λ ¬
int left = 0, right = N - 1;
int target, result;
scanf("%d", &target);
while(left <= right) {
int mid = (left + right) / 2;
if(A[mid] == target) {
result = A[mid];
break;
}
else if(A[mid] < target) left = mid + 1;
else right = mid - 1;
}
printf("%d\n", result);
return 0;
}
'μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦] λμ ν©(prefix sum) (0) | 2024.11.09 |
---|---|
[μκ³ λ¦¬μ¦] κ·Έλν μν λ¬Έμ - 2. λλΉ μ°μ νμ(BFS) (0) | 2021.07.22 |
[μκ³ λ¦¬μ¦] κ·Έλν μν λ¬Έμ - 1. κΉμ΄ μ°μ νμ(DFS) (0) | 2021.07.21 |
[μκ³ λ¦¬μ¦] μ λ ¬ - 2. ν΅ μ λ ¬(Quick Sort) (0) | 2021.07.15 |
[μκ³ λ¦¬μ¦] μ λ ¬ - 1. λ³ν© μ λ ¬(Merge Sort) (0) | 2021.07.14 |