์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿˆ

์ด์ง„ ํƒ์ƒ‰

Jeein0313 2022. 8. 10. 13:34

์ด์ง„ํƒ์ƒ‰์ด๋ž€?

์ด์ง„ํƒ์ƒ‰์€ ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ขํ˜€๊ฐ€๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ์ด์ง„ํƒ์ƒ‰์€ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜ 3๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํƒ์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฒ”์œ„์˜ ์‹œ์ž‘์ , ๋์ , ์ค‘๊ฐ„์ ์ด๋‹ค. ์ฐพ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ์™€ ์ค‘๊ฐ„์  ์œ„์น˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋น„๊ตํ•ด์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ฒŒ ์ด์ง„ ํƒ์ƒ‰ ๊ณผ์ •์ด๋‹ค. ์ ˆ๋ฐ˜์”ฉ ๋ฐ์ดํ„ฐ๋ฅผ ์ค„์–ด๋“ค๋„๋ก ๋งŒ๋“ ๋‹ค๋Š” ์ ์€ ํ€ต์ •๋ ฌ๊ณผ ๊ณตํ†ต์ ์ด ์žˆ๋‹ค.

์ด์ง„ํƒ์ƒ‰ ํŒŒ์ด์ฌ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

def binary_search1(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_search1(array, target, start, mid-1);
    else: #์ค‘๊ฐ„์ ๋ณด๋‹ค ํƒ€๊ฒŸ์ด ํฐ ๊ฒฝ์šฐ
        return binary_search1(array, target,mid+1,end);


def binary_search2(array, target, start, end):
    while start<=end:
        mid=(start+end)//2;
        if array[mid]==target:
            return mid;
        elif array[mid]>target:
            end=mid-1;
        else:
            start=mid+1;
    return None;


n, target=list(map(int, input().split()))
array=list(map(int, input().split()))


result=binary_search2(array,target,0,n-1);
if result==None:
    print('์›์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ.')
else:
    print((result+1),'๋ฒˆ์งธ์— ์กด์žฌํ•จ.')

๋‹จ๊ณ„๋งˆ๋‹ค ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“œ๋ฏ€๋กœ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” logN์— ๋น„๋ก€. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(logN).

 

ํŒŒ์ด์ฌ ์ด์ง„ํƒ์ƒ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

from bisect import bisect_left,bisect_right
from itertools import count

a=[1,2,4,4,8]
x=4

print(bisect_left(a,x)) #2
print(bisect_right(a,x)) #4


#๊ฐ’์ด ํŠน์ • ๋ฒ”์œ„์— ์†ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ
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,3,3,3,3,3,4,4,8,9]
#๊ฐ‘์‹ฑ 4์ธ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ
print(count_by_range(a,4,4)) #2

#๊ฐ’์ด 1~3 ๋ฒ”์œ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ
print(count_by_range(a,1,3)) #7

bisect_left(a, x) : ์ •๋ ฌ๋œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฐ์—ด a์— x๋ฅผ ์‚ฝ์ž…ํ•  ๊ฐ€์žฅ ์™ผ์ชฝ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜

bisect_right(a, x) : ์ •๋ ฌ๋œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฐ์—ด a์— x๋ฅผ ์‚ฝ์ž…ํ•  ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜

 

ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜(Parametric Search)

ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜๋ž€ ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ๊ฒฐ์ • ๋ฌธ์ œ๋กœ ๋ฐ”๊พธ์–ด ํ•ด๊ฒฐํ•˜๋Š” ๊ธฐ๋ฒ•
(ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํŠน์ • ๋ณ€์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’, ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒฐ์ • ๋ฌธ์ œ๋กœ ๋ฐ”๊พธ์–ด ํ‘ธ๋Š” ๊ฒƒ)

์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜ ๋ฌธ์ œ๋Š” ์ด์ง„ ํƒ์ƒ‰์„ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ.

 

ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด..

1) ๊ฒฐ์ • ๋ฌธ์ œ๋ฅผ ์ •์˜ํ–ˆ์„ ๋•Œ, ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

2) ์ตœ์†Ÿ๊ฐ’์ด x๋ผ๋ฉด, x ์ด์ƒ์˜ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑ

3) ์ตœ๋Œ“๊ฐ’์ด x๋ผ๋ฉด, x ์ดํ•˜์˜ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑ

 

https://sarah950716.tistory.com/16