๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_26_์ด์ง„ํƒ์ƒ‰ ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with python

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_26_์ด์ง„ํƒ์ƒ‰

์ง•์ง•์•ŒํŒŒ์นด 2022. 2. 8. 23:35
728x90
๋ฐ˜์‘ํ˜•

220208 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ใ€Ž์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹คใ€ ์˜ 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))

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments