Computer Science/Algorithms

๐Ÿ‘€ Binary Search ๐Ÿ‘€

metamong 2022. 12. 6.

intro

๐Ÿง ์ˆœ์ฐจ ํƒ์ƒ‰ - ์„ ํ˜• ํƒ์ƒ‰) ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์žˆ๋Š” ํŠน์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์•ž์—์„œ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธ (๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ - ํ•œ ๊ฐœ์”ฉ ํ™•์ธ)

๐Ÿง ์ด์ง„ ํƒ์ƒ‰) ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ์—์„œ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ขํ˜€๊ฐ€๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰(์‹œ์ž‘์ , ๋์ , ์ค‘๊ฐ„์ ์„ ์ด์šฉํ•˜์—ฌ ํƒ์ƒ‰ ๋ฒ”์œ„ ์„ค์ •)

 

โ€ป ์ด์ง„ ํƒ์ƒ‰์€ ์ˆœ์ฐจ ํƒ์ƒ‰์— ๋น„ํ•ด ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ํ›จ์”ฌ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” log์‹œ๊ฐ„์„ ๋ณด์ธ๋‹ค.

 

Q. ์ด๋ฏธ ์ •๋ ฌ๋œ 10๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ๊ฐ’์ด 4์ธ ์›์†Œ๋ฅผ ์ฐพ๊ธฐ

0 - 2 - 4 - 6 - 8 - 10 - 12 - 14 - 16 - 18

 

โ‘  ์‹œ์ž‘์ ) index 0, ์ค‘๊ฐ„์ ) index 4, ๋์ ) index 9
์ค‘๊ฐ„์ ์ด 2๊ฐœ ์กด์žฌํ•œ๋‹ค๋ฉด, ์†Œ์ˆ˜์ ์€ ์ œ์™ธํ•œ ์•ž๋ถ€๋ถ„์„ ์„ค์ •ํ•œ๋‹ค

→ 4๊ฐ€ ์ค‘๊ฐ„์  ๊ธฐ์ค€ ์™ผ์ชฝ์— ์กด์žฌํ•จ์„ ํ™•์ธํ•˜๋ฉด, ์ค‘๊ฐ„์  ๊ธฐ์ค€ ์˜ค๋ฅธ์ชฝ ํƒ์ƒ‰ x

 

โ‘ก ์‹œ์ž‘์ ) index 0, ์ค‘๊ฐ„์ ) index 1, ๋์ ) index 3

→ ์ค‘๊ฐ„์  ๊ธฐ์ค€ 4๊ฐ€ ์˜ค๋ฅธ์ชฝ์— ์กด์žฌํ•˜๋ฏ€๋กœ, ์ค‘๊ฐ„์  ๊ธฐ์ค€ ์™ผ์ชฝ ํƒ์ƒ‰ x

 

โ‘ข ์‹œ์ž‘์ , ์ค‘๊ฐ„์ ) index 2, ๋์ ) index 3

→ ์ค‘๊ฐ„์ ์— ์œ„์น˜ํ•œ ์›์†Œ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์›์†Œ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

โ€ป ๋‹จ๊ณ„๋งˆ๋‹ค ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ 2๋กœ ๋‚˜๋ˆ„๊ธฐ ๋•Œ๋ฌธ์—, ์—ฐ์‚ฐํšŸ์ˆ˜๋Š” $\log_2 N$์— ๋น„๋ก€

 

โ€ป ๋”ฐ๋ผ์„œ, ์ด์ง„ํƒ์ƒ‰์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” $O(log N)$ โ€ป

binary search python

Q. binary searchํ•˜๋Š” ์›์†Œ์˜ ๊ฐฏ์ˆ˜์™€ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ธ target์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ , target์ด ์กด์žฌํ•œ๋‹ค๋ฉด, '๋ช‡ ๋ฒˆ์งธ์— ์กด์žฌ'ํ•˜๋Š”์ง€ ์ถœ๋ ฅ

 

โ‘  ์žฌ๊ท€ ๊ตฌํ˜„

def binary_search(array, target, start, end):
    if start > end:
        return None
    mid = (start+end)//2
    if array[mid] == target:
        return mid #์ค‘๊ฐ„์ ์ด target์ด๋ฉด ๋!
    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('no target found')
else: print(result+1)

 

โ‘ก ๋ฐ˜๋ณต๋ฌธ ๊ตฌํ˜„

def binary_search(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_search(array,target,0,n-1)
if result==None: print('no target found')
else: print(result+1)

 

โ˜… start index <= end index์ธ ๋™์•ˆ ๊ณ„์† ์ง„ํ–‰

ํŠน์ • ์›์†Œ ๋นˆ๋„ ์ˆ˜ ๊ตฌํ•˜๊ธฐ

(1) binary search๋ฅผ ํ™œ์šฉํ•œ left / right index ๊ฐ๊ฐ ๊ตฌํ•˜๊ธฐ

๐Ÿง ๋จผ์ € ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๊ณ  ๋‚œ ๋’ค, ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ํŠน์ • ์›์†Œ๊ฐ€ ๋ช‡ ๊ฐœ ์กด์žฌํ•˜๋Š” ์ง€ ์•Œ๊ณ  ์‹ถ์„ ๋•Œ binary search algorithm์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠน์ • ์›์†Œ๊ฐ€ ์™ผ์ชฝ ๊ธฐ์ค€ ์ฒซ ๋ฒˆ์งธ๋กœ ๋“ฑ์žฅํ•˜๋Š” index๋ฅผ A๋ผ ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ ๊ธฐ์ค€ ์ฒซ ๋ฒˆ์งธ๋กœ ๋“ฑ์žฅํ•˜๋Š” index + 1์„ B๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ํŠน์ • ์›์†Œ์˜ ๋นˆ๋„์ˆ˜๋Š” B-A๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ A์™€ B๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์„ binary search ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด ๋•Œ, left๋Š” ๋ง ๊ทธ๋ž˜๋„ ์™ผ์ชฝ ๊ธฐ์ค€ ์ฒซ๋ฒˆ์งธ ๋“ฑ์žฅ ์›์†Œ์˜ index์ด์ง€๋งŒ, right๋Š” ์˜ค๋ฅธ์ชฝ ๊ธฐ์ค€ ์ฒซ๋ฒˆ์งธ ๋“ฑ์žฅ ์›์†Œ์˜ index + 1์ด๋‹ค

์˜ค๋ฅธ์ชฝ ์ฃผ์˜

 

๐Ÿง ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ํŠน์ • ์ˆ˜๋ฅผ target์ด๋ผ ํ•˜๊ณ  ์ด๋ฏธ ์ •๋ ฌ๋œ array๋ฅผ l์ด๋ผ ํ•˜์ž, A์™€ B๋ฅผ ๊ฐ๊ฐ left()์™€ right()๋กœ ๊ตฌํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

def left(target, l):
    st,en=0,len(l)
    while st<en:
        mid=(st+en)//2
        if l[mid]>=target:
            en=mid
        elif l[mid]<target:
            st=mid+1
    #when st==en
    return st

def right(target, l):
    st,en=0,len(l)
    while st<en:
        mid=(st+en)//2
        if l[mid]>target:
            en=mid
        elif l[mid]<=target:
            st=mid+1
    #when st==en
    return st

 

โ˜… left()

โ‘  st์™€ en ๊ฐ๊ฐ index 0 / len(l)์ด๋ผ ํ•œ๋‹ค. ์ด ๋•Œ , en index๋ฅผ ๋งจ ๋์˜ ์›์†Œ index + 1์— ์ฃผ์˜(๊ทธ๋ž˜์•ผ๋งŒ ๋ฐฐ์—ด์— ์›์†Œ๊ฐ€ 1๊ฐœ ์žˆ์„ ๋•Œ๋„ ์ ์šฉ๊ฐ€๋Šฅ)

 

โ‘ก st < en์ธ ๋™์•ˆ while๋ฌธ ๋Œ๋ฆผ (st์™€ en์ด ๊ฐ™์„ ๋•Œ while๋ฌธ ์ข…๋ฃŒ)

 

โ‘ข

(1) l[mid] > target๋ผ๋ฉด en์„ mid (์™œ๋ƒ๋ฉด target์˜ ์—ฐ์†๋œ ๋ฐฐ์—ด์€ mid -1 ๊นŒ์ง€์˜ ์•ž์— ์กด์žฌํ•˜๊ณ  / ๋งŒ์•ฝ target์ด ์—†๋‹ค๋ฉด ์ตœ๋Œ€ mid ๊นŒ์ง€ ์กด์žฌ)

(2) l[mid] < target๋ผ๋ฉด st๋ฅผ mid+1 (์™œ๋ƒ๋ฉด target์˜ ์—ฐ์†๋œ ๋ฐฐ์—ด์€ mid + 1๋ถ€ํ„ฐ ๋๊นŒ์ง€์— ์กด์žฌํ•˜๊ณ  / ๋งŒ์•ฝ target์ด ์—†๋‹ค๋ฉด ์ตœ์†Œ mid + 1๋ถ€ํ„ฐ ์กด์žฌ)

 

Q. en์„ mid-1๋กœ ํ•˜์ง€ ์•Š๋Š” ์ด์œ 

ex) ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ 22๊ฐ€ ์•„๋‹Œ, 23์˜ left๋ฅผ ์ฐพ๋Š”๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด 23์˜ left๋Š” mid์ธ en์ด ๋˜๋ฏ€๋กœ, en์€ mid๋กœ ํ•ญ์ƒ ์„ค์ •(์œ„ ์˜ค๋ฅธ์ชฝ index๋Š” ํ•ญ์ƒ ๋งˆ์ง€๋ง‰ ๋“ฑ์žฅ ์›์†Œ + 1์ด๊ธฐ ๋•Œ๋ฌธ)

 

(3) l[mid] == target์ด๋ผ๋ฉด left๋Š” ์ ์–ด๋„ mid์˜ index๋ณด๋‹ค ํฌ์ง€๋Š” ์•Š๊ฒ ๋‹ค๋Š” ๊ฑธ ์•Œ๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” left๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ end๋ฅผ mid๋กœ ํ•ด์„œ mid ๊ธฐ์ค€ mid ํฌํ•จ ์™ผ์ชฝ ๋ฒ”์œ„๋กœ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

โ‘ฃ while๋ฌธ ์ข…๋ฃŒ๋  ๋•Œ๋Š” st์™€ en์ด ๊ฐ™์„ ๋•Œ์ด๋ฏ€๋กœ ๊ทธ ๋•Œ st๊ฐ’์„ left๊ฐ’์œผ๋กœ return

 

โ˜… right()

โ‘ โ‘ก ๋ชจ๋‘ ์œ„ left()์™€ ๋™์ผ

 

โ‘ข

(1) l[mid] > target์ด๋ผ๋ฉด en์„ mid

(2) l[mid] < target์ด๋ผ๋ฉด st๋ฅผ mid + 1

(3) l[mid] == target์ด๋ผ๋ฉด right๋Š” ์ ์–ด๋„ mid + 1๋ถ€ํ„ฐ ์กด์žฌ. ์ฆ‰ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์ด๋ฏ€๋กœ ์œ„ left์™€ ์ด ๋ถ€๋ถ„๋งŒ ๋‹ค๋ฆ„

 

โ‘ฃ ์œ„ left()์™€ ๋™์ผ

 

โ€ป ์•„๋ž˜ ์˜ˆ์‹œ ๊ทธ๋ฆผ array์—์„œ 22๋ฅผ target์œผ๋กœ ์ฐพ๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ทธ๋ฆผ ์‹œ๊ฐํ™”ํ•˜๋ฉฐ ์ฝ”๋“œ ์ง„ํ–‰ํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ํ›จ์”ฌ ์‰ฝ๋‹ค

(2) ํ•จ์ˆ˜ ์‚ฌ์šฉ bisect_left() / bisect_right()

โ˜… ์œ„ ์ง์ ‘ ๊ตฌํ˜„ํ•œ binary search ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งค์šฐ ์‰ฝ๊ฒŒ bisect_left() / bisect_right() ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด ๋ฐ”๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿง bisect_left(a,x): ์ •๋ ฌ๋œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฐ์—ด a์— x๋ฅผ ์‚ฝ์ž…ํ•  ๊ฐ€์žฅ ์™ผ์ชฝ index ๋ฐ˜ํ™˜

๐Ÿง biset_right(a,x): ์ •๋ ฌ๋œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฐ์—ด a์— x๋ฅผ ์‚ฝ์ž…ํ•  ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ index ๋ฐ˜ํ™˜

from bisect import bisect_left, bisect_right
a = [1,2,4,4,8]
x = 4
print(bisect_left(a, x)) #2
print(bisect_right(a, x)) #4

 

→ ์ฆ‰, x๊ฐ€ ๋ฐฐ์—ด a์—์„œ ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ตœ์†Ÿ๊ฐ’์˜ index์™€ ์ตœ๋Œ“๊ฐ’์˜ index๊ฐ€ bisect_left์™€ bisect_right ๊ฒฐ๊ณผ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

→ bisect_left ๊ฒฐ๊ด๊ฐ’: x๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์˜ ๋งจ ์™ผ์ชฝ ์›์†Œ index

→ bisect_right ๊ฒฐ๊ด๊ฐ’: x๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์˜ ๋งจ ์˜ค๋ฅธ์ชฝ ์›์†Œ '๊ทธ ๋‹ค์Œ ์›์†Œ' index

 

๐Ÿง ์‘์šฉํ•ด์„œ, ์•„๋ž˜์™€ ๊ฐ™์ด '๊ฐ’์ด ํŠน์ • ๋ฒ”์œ„์— ์†ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜'๋ฅผ ๊ตฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

โ˜… ๊ฐ’์ด A์™€ B ์‚ฌ์ด(๋‘˜ ๋‹ค ํฌํ•จ)์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด bisect_left()์— A / bisect_right()์— B๋ฅผ ๋„ฃ์–ด B-A๊ฐ€ ๊ฐœ์ˆ˜

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,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)) #6

* Binary Search ๋Œ€ํ‘œ ์œ ํ˜• ๋ฌธ์ œํ’€์ด>

Q1. ๋–ก๋ณถ์ด ๋–ก ๋งŒ๋“ค๊ธฐ

Q. ์˜ค๋Š˜ ๋ผ์ด์–ธ์€ ์—ฌํ–‰ ๊ฐ€์‹  ๋ถ€๋ชจ๋‹˜์„ ๋Œ€์‹ ํ•ด์„œ ๋–ก์ง‘ ์ผ์„ ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ๋–ก๋ณถ์ด ๋–ก์„ ๋งŒ๋“œ๋Š” ๋‚ ์ž…๋‹ˆ๋‹ค. ๋ผ์ด์–ธ๋„ค ๋–ก๋ณถ์ด ๋–ข์€ ์žฌ๋ฐŒ๊ฒŒ๋„ ๋–ก๋ณถ์ด ๋–ก์˜ ๊ธธ์ด๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ํ•œ ๋ด‰์ง€ ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋–ก์˜ ์ด ๊ธธ์ด๋Š” ์ ˆ๋‹จ๊ธฐ๋กœ ์ž˜๋ผ์„œ ๋งž์ถฐ์ค๋‹ˆ๋‹ค. ์ ˆ๋‹จ๊ธฐ์— ๋†’์ด(H)๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ค„์ง€์–ด์ง„ ๋–ก์„ ํ•œ ๋ฒˆ์— ์ ˆ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋†’์ด๊ฐ€ H๋ณด๋‹ค ๊ธด ๋–ก์€ H ์œ„์˜ ๋ถ€๋ถ„์ด ์ž˜๋ฆด ๊ฒƒ์ด๊ณ , ๋‚ฎ์€ ๋–ก์€ ์ž˜๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋†’์ด๊ฐ€ 19, 14, 10, 17cm์ธ ๋–ก์ด ๋‚˜๋ž€ํžˆ ์žˆ๊ณ  ์ ˆ๋‹จ๊ธฐ ๋†’์ด๋ฅผ 15cm๋กœ ์ง€์ •ํ•˜๋ฉด ์ž๋ฅธ ๋’ค ๋–ก์˜ ๋†’์ด๋Š” 15, 14, 10, 15cm๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž˜๋ฆฐ ๋–ก์˜ ๊ธธ์ด๋Š” ์ฐจ๋ก€๋Œ€๋กœ 4, 0, 0, 2cm์ž…๋‹ˆ๋‹ค. ์†๋‹˜์€ 6cm๋งŒํผ์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ ธ๊ฐ‘๋‹ˆ๋‹ค. ์†๋‹˜์ด ์™”์„ ๋•Œ ์š”์ฒญํ•œ ์ด ๊ธธ์ด๊ฐ€ M์ผ ๋•Œ '์ ์–ด๋„ M'๋งŒํผ์˜ ๋–ก์„ ์–ป๊ธฐ ์œ„ํ•ด ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์˜ '์ตœ๋Œ“๊ฐ’'์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

 

 

โ‘  ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๊ฐ€ 0์ด์ƒ 10์–ต์ดํ•˜์ธ ๋งค์šฐ ํฐ ๋ฒ”์œ„์— ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœ ์„ ํ˜• ํƒ์ƒ‰์ด ์•„๋‹Œ, ์ด์ง„ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค

โ‘ก ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ž˜๋ฆฐ ๋–ก์˜ ๊ธธ์ด ํ•ฉ์ด M๋ณด๋‹ค ํฐ ์ง€, ์•„๋‹Œ ์ง€ ๋‘ ๊ฐ€์ง€ ๊ฒฐ๊ณผ ๊ฐ€์ง“์ˆ˜์— ์˜ํ•ด ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์ง„ํƒ์ƒ‰ ์œ ํ˜•์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

โ–ถ ์ฆ‰, ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ์ค‘๊ฐ„์ ์˜ ๊ฐ’์ด '์ตœ์ ํ™”๋œ ๊ฐ’'์œผ๋กœ ๋ณ€ํ•˜๋ฏ€๋กœ, ์ด์ง„ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์ค‘๊ฐ„์ ์˜ ๊ฐ’์„ ๊ณ„์† updateํ•˜๋ฉด ๋œ๋‹ค

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

start=0
end=max(array)

res=0
while(start<=end):
    total=0
    mid=(start+end)//2
    for x in array:
        #์ž˜๋ž์„ ๋•Œ ๋–ก์˜ ์–‘
        if x > mid:
            total+=x-mid
    #๋–ก์˜ ์–‘์ด ๋ถ€์กฑํ•˜๋ฉด ๋” ๋งŽ์ด ์ž๋ฅด๊ธฐ (์™ผ์ชฝ ๋ถ€๋ถ„ ํƒ์ƒ‰)
    if total < m:
        end=mid -1
    #๋–ก์˜ ์–‘์ด ์ถฉ๋ถ„ํ•˜๋ฉด ๋œ ์ž๋ฅด๊ธฐ (์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํƒ์ƒ‰)
    else:
        res=mid
        start=mid+1
#์ตœ์ข…์ ์ธ res๊ฐ€ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋‹ต
print(res)

Q2. ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ํŠน์ • ์ˆ˜์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

Q. N๊ฐœ์˜ ์›์†Œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์ˆ˜์—ด์ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค. ์ด๋•Œ ์ด ์ˆ˜์—ด์—์„œ x๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ํšŸ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์—ด {1,1,2,2,2,2,3}์ด ์žˆ์„ ๋•Œ x=2๋ผ๋ฉด, ํ˜„์žฌ ์ˆ˜์—ด์—์„œ ๊ฐ’์ด 2์ธ ์›์†Œ๊ฐ€ 4๊ฐœ์ด๋ฏ€๋กœ 4๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

โ€ป ๋‹จ, ์ด ๋ฌธ์ œ๋Š” ์‹œ๊ฐ„๋ณต์žก๋„ $O(logN)$์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๊ณ„ํ•˜์ง€ ์•Š์œผ๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ ํŒ์ •์„ ๋ฐ›๋Š”๋‹ค.

 

โ–ถ ๋‘ index์˜ ์ฐจ์ด๋กœ, ์›ํ•˜๋Š” value์˜ ๋ฒ”์œ„ ๋˜๋Š”, ๊ทธ value๊ฐ’ ์ž์ฒด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

from bisect import bisect_left, bisect_right

def count_by_range(array,left_value,right_value):
    right_index=bisect_right(array,right_value)
    left_index=bisect_left(array,left_value)
    return right_index-left_index

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

count=count_by_range(array,x,x)

if count==0: print(-1)
else: print(count)

์ด์ฝ”ํ…Œ 2021

BaaarkingDog

 

'Computer Science > Algorithms' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿ›Dynamic Programming๐Ÿ›  (1) 2023.01.03
bitmasking  (0) 2022.12.20
understanding pesudo-code of QuickSort  (0) 2022.12.05
DFS / BFS  (0) 2022.10.14
๐ŸงญRecursion  (0) 2022.09.27

๋Œ“๊ธ€