๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_26_์ด์งํ์ ๋ณธ๋ฌธ
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_26_์ด์งํ์
์ง์ง์ํ์นด 2022. 2. 8. 23:35220208 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ใ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋คใ ์ youtube๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค>
https://www.youtube.com/watch?v=-Gx0T92-7h8&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=26
1. ์์ฐจ ํ์
: ๋ฆฌ์คํธ ์์ ์๋ ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ์์์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธ
2. ์ด์ง ํ์
: ์ ๋ ฌ๋์ด ์๋๋ฆฌ์คํธ์์ ํ์ ๋ฒ์๋ฅผ ์ ๋ฐ์ฉ ์ขํ๊ฐ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ
: ์์์ , ๋์ , ์ค๊ฐ์ ์ ์ด์ฉํ์ฌ ํ์ ๋ฒ์ ์ค์
1) ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐ์ดํฐ, 4๋ฅผ ์ฐพ์๋ณด์
2) ์์์ [0], ๋์ 9, ์ค๊ฐ์ [4](์์์ ์ดํ ์ ๊ฑฐ)
3) ์ค๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ๊บผ๋ง ์ด๋ฆผ
4) ๋ค์ ์์, ์ค๊ฐ, ๋์ ์ฐพ๋๋ค 0, 2, 4, 6
5) 2 ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ๊บผ๋ง ์ด๋ฆผ
6) 4, 6 ๋
- python
def binary_search(array, target, start, end) : if start > end : return None mid = (start + end) // 2 if array[mid] == target : return mid # ์ผ์ชฝ ์ด๋ฆผ elif array[mid] > target : return binary_search(array, target, start, mid-1) # ์ค๋ฅธ์ชฝ ์ด๋ฆผ else : return binary_search(array, target, mid+1, end) n, target = list(map(int, input().split())) array = list(map(int, input().split())) result = binary_search(array, target, 0, n-1) if result == None : print("์์ ์์") else : print(result+1)
- c++
#include <bits/stdc++.h>
using namespace std;
// ์ด์ง ํ์ ์์ค์ฝ๋ ๊ตฌํ(๋ฐ๋ณต๋ฌธ)
int binarySearch(vector<int>& arr, int target, int start, int end) {
while (start <= end) {
int mid = (start + end) / 2;
// ์ฐพ์ ๊ฒฝ์ฐ ์ค๊ฐ์ ์ธ๋ฑ์ค ๋ฐํ
if (arr[mid] == target) return mid;
// ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ผ์ชฝ ํ์ธ
else if (arr[mid] > target) end = mid - 1;
// ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ํฐ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ ํ์ธ
else start = mid + 1;
}
return -1;
}
// N(๊ฐ๊ฒ์ ๋ถํ ๊ฐ์)์ M(์๋์ด ํ์ธ ์์ฒญํ ๋ถํ ๊ฐ์)
int n, m;
// ๊ฐ๊ฒ์ ์๋ ์ ์ฒด ๋ถํ ๋ฒํธ๋ค
vector<int> arr;
// ์๋์ด ํ์ธ ์์ฒญํ ๋ถํ ๋ฒํธ๋ค
vector<int> targets;
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
// ์ด์ง ํ์์ ์ํํ๊ธฐ ์ํด ์ฌ์ ์ ์ ๋ ฌ ์ํ
sort(arr.begin(), arr.end());
cin >> m;
for (int i = 0; i < m; i++) {
int target;
cin >> target;
targets.push_back(target);
}
// ์๋์ด ํ์ธ ์์ฒญํ ๋ถํ ๋ฒํธ๋ฅผ ํ๋์ฉ ํ์ธ
for (int i = 0; i < m; i++) {
// ํด๋น ๋ถํ์ด ์กด์ฌํ๋์ง ํ์ธ
int result = binarySearch(arr, targets[i], 0, n - 1);
if (result != -1) {
cout << "yes" << ' ';
}
else {
cout << "no" << ' ';
}
}
}
- java
import java.util.*;
public class Main {
// ์ด์ง ํ์ ์์ค์ฝ๋ ๊ตฌํ(์ฌ๊ท ํจ์)
public static int binarySearch(int[] arr, int target, int start, int end) {
if (start > end) return -1;
int mid = (start + end) / 2;
// ์ฐพ์ ๊ฒฝ์ฐ ์ค๊ฐ์ ์ธ๋ฑ์ค ๋ฐํ
if (arr[mid] == target) return mid;
// ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ผ์ชฝ ํ์ธ
else if (arr[mid] > target) return binarySearch(arr, target, start, mid - 1);
// ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ํฐ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ ํ์ธ
else return binarySearch(arr, target, mid + 1, end);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// ์์์ ๊ฐ์(n)์ ์ฐพ๊ณ ์ ํ๋ ๊ฐ(target)์ ์
๋ ฅ๋ฐ๊ธฐ
int n = sc.nextInt();
int target = sc.nextInt();
// ์ ์ฒด ์์ ์
๋ ฅ๋ฐ๊ธฐ
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
// ์ด์ง ํ์ ์ํ ๊ฒฐ๊ณผ ์ถ๋ ฅ
int result = binarySearch(arr, target, 0, n - 1);
if (result == -1) {
System.out.println("์์๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.");
}
else {
System.out.println(result + 1);
}
}
}
3. ์ด์ง ํ์ ์๊ฐ ๋ณต์ก๋
: ๋จ๊ณ๋ง๋ค ํ์ ๋ฒ์๋ฅผ 2๋ก ๋๋๋ ๊ฒ
: ์ฐ์ฐํ์๋ log2N์ ๋น๋ก
: ์๊ฐ๋ณต์ก๋๋ O(logN)
=> O(logN)
4. ํ์ด์ฌ ์ด์ง ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- bisect_left(a, x) : ์ ๋ ฌ๋ ์์๋ฅผ ์ ์งํ๋ฉด์ ๋ฐฐ์ด a์ x๋ฅผ ์ฝ์ ํ ๊ฐ์ฅ ์ผ์ชฝ ์ธ๋ฑ์ค๋ฅผ ๋ฐํ
- bisect_right(a, x) : ์ ๋ ฌ๋ ์์๋ฅผ ์ ์งํ๋ฉด์ ๋ฐฐ์ด a์ x๋ฅผ ์ฝ์ ํ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค๋ฅผ ๋ฐํ
from bisect import bisect_left, bisect_right
a = [1, 2, 4, 4, 8]
x = 4
print(bisect_left(a, x))
print(bisect_right(a, x))
+) ๊ฐ์ด ํน์ ๋ฒ์์ ์ํ๋ ๋ฐ์ดํฐ ๊ฐ์ ๊ตฌํ๊ธฐ
from bisect import bisect_left, bisect_right
def count_by_range(a, left_value, right_value) :
right_index = bisect_right(a, right_value)
left_index = bisect_left(a, left_value)
return right_index - left_index
a = [1, 2, 4, 4, 6, 6, 6, 7, 8]
# 4 ๋ช๊ฐ
print(count_by_range(a, 4, 4))
# [-1, 3] ๋ฒ์ ๊ฐ์
print(count_by_range(a, -1, 3))