Skip to content

Commit

Permalink
feat : [Algorithm] 이분탐색 (#34)
Browse files Browse the repository at this point in the history
* feat : [Algorithm] 백트래킹 정리

* fix : 이미지 깨진거 수정

* feat : [Alogorithm] DFS 정리

* fix : 이미지 깨진거 수정

* feaat : binary search push
  • Loading branch information
cywin1018 authored Jan 19, 2025
1 parent 47faa4b commit fb70375
Showing 1 changed file with 47 additions and 0 deletions.
47 changes: 47 additions & 0 deletions Algorithm/이분탐색.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
>이분 탐색이란?
>정렬되어 있는 배열에서 빠른속도(O(logn))로 탐색할 수 있는 탐색방법
## 예시

<img width="799" alt="image" src="https://github.com/user-attachments/assets/483143d3-3a79-4853-81c4-ba356ec8cf46" />
위의 이미지에서 오름차순으로 정렬되어 있는 배열이 존재한다고 하자.
(시작점+끝점)/2 = 중앙값이라고 할때, 탐색 값이 중앙값보다 작다면, 중앙값보다 크거나 같은 곳은 탐색할 필요가 없다.


## 예시문제
![image](https://github.com/user-attachments/assets/8c491bae-8d0e-475f-8a32-2faa1ac2054c)

기본적인 이분탐색을 사용해서 해결하는 문제, c++의 lower_bound()를 이용하면 쉽게 해결할 수 있는 문제이다. 일반적인 탐색방법으로는 위의 문제에서의 정수의 범위를 견딜 수 없으니, 이분탐색을 통해 배열에 해당 수가 있는지 없는지 파악하면 해결할 수 있다.

## 해결 코드(c++)
```c++
#include <bits/stdc++.h>
#define endl "\n"
using ll = long long;
using namespace std;
vector<ll>A;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);

ll n; cin >> n;
for (int i=0;i<n;i++) {
ll num;cin >> num;
A.push_back(num);
}
sort(A.begin(),A.end());
ll m,num; cin >> m;
for (int i=0;i<m;i++) {
cin >> num;
ll idx = lower_bound(A.begin(),A.end(),num)-A.begin();

if (idx < n && A[idx] == num)
cout << 1 << endl;
else
cout << 0 << endl;
}
}
```

## 추천 문제
https://www.acmicpc.net/problem/12015 가장 긴 증가하는 부분수열2 (1은 다른 태그라서 pass)

0 comments on commit fb70375

Please sign in to comment.