์ƒˆ์†Œ์‹

IN DEPTH CAKE/Coding-WIKI

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ด์ง„ ํƒ์ƒ‰ (Binary Search) - ์ค‘๋ณต๋œ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ๊นŒ์ง€ ์‚ดํŽด๋ณด๊ธฐ

  • -

 

 


 

๋ชฉ์ฐจ ๐ŸŒ 

  • ๊ฐœ์š”
  • ์ด์ง„ ํƒ์ƒ‰ ์„ค๋ช…
  • ์ด์ง„ ํƒ์ƒ‰ template
    • Array ๋‚ด์— ์ค‘๋ณต๋œ ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ
    • Array ๋‚ด์— ์ค‘๋ณต๋œ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ

 

  • ์ฃผ์š” ํŒจํ„ด ์„ค๋ช…์€ ๋‹ค์Œ์—...

 


 

๊ฐœ์š”

 

์ด์ง„ ํƒ์ƒ‰์€ ํฌ๊ธฐ๊ฐ€ $n$ ์ธ search space์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, worst case์—์„œ์˜ ๋ณต์žก๋„๊ฐ€ $O(\log n)$ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์ง„ ํƒ์ƒ‰์€ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ํƒ์ƒ‰ ๊ณต๊ฐ„์— ๋Œ€ํ•ด์„œ ์ ์šฉ๋œ๋‹ค. ์ด์ง„ ํƒ์ƒ‰์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋“ค ์ค‘ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด...

 

  • ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€๊ณ  ํŠน์ • ๊ฐ’์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•  ์œ„์น˜๋ฅผ ๋ฌผ์–ด๋ณด๋Š” ๊ฒฝ์šฐ
  • ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ ํŠน์ • ๊ฐ’ ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ž‘์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐœ์ˆ˜๋ฅผ ๋ฌผ์–ด๋ณด๋Š” ๊ฒฝ์šฐ
    • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ์ฃผ๋กœ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์ด ์กฐ๊ฑด ๋งŒ์กฑ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‘ ๊ฐœ์˜ ์˜์—ญ (๊ฐ€๋Šฅ, ๋ถˆ๊ฐ€๋Šฅ)์œผ๋กœ ๋‚˜๋‰˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค.
    • ๋ฌด์Šจ๋ง์ด๋ƒ๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ๋ฌธ์˜ ๊ฐ•๋„๊ฐ€ array๋กœ ์ฃผ์–ด์ง€๊ณ  constant x ์ฃผ๋ฌธ ๊ฐ•๋„[i]๊ฐ€ strength (constraint ๊ฐ’) ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด constant x ์ฃผ๋ฌธ ๊ฐ•๋„[i]์˜ ๊ฒฝ์šฐ, ํ•ด๋‹น ๊ฐ’์ด strength๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์ฃผ๋ฌธ ๊ฐ•๋„[i]๋ณด๋‹ค ์ž‘์€ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ์œ„์˜ ์กฐ๊ฑด์„ ์—ญ์‹œ๋‚˜ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ, ์ฃผ๋ฌธ๊ฐ•๋„[i]๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๊ตณ์ด ์ฒดํฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค
  • ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€์ง€ ์•Š๊ณ  ํŠน์ • ๋ฒ”์œ„ ๋‚ด์—์„œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ๋Œ“๊ฐ’ ํ˜น์€ ์ตœ์†Ÿ๊ฐ’์„ ๋ฌผ์–ด๋ณด๋Š” ๊ฒฝ์šฐ
    • ์ด ๊ฒฝ์šฐ๋„ ๊ฒฐ๊ตญ ์œ„์˜ ์˜ˆ์ œ์™€ ๊ฐ™๋‹ค. ์–ด๋–ค ์กฐ๊ฑด์ด ์ฃผ์–ด์ง€๊ณ , ํ•ด๋‹น ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๋„๋กํ•˜๋Š” ์ตœ๋Œ€ ํ˜น์€ ์ตœ์†Œ์˜ $x$์˜ ๊ฐ’์„ ๋ฌป๋Š” ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์˜ ๋งŒ์กฑ์—ฌ๋ถ€๊ฐ€ $x$์˜ ๊ฐ’์˜ ๋ฒ”์œ„์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๋ฉด ์—ญ์‹œ binary search๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์„ค๋ช…์ด ์กฐ๊ธˆ ์ด์ƒํ•˜๊ธดํ•œ๋ฐ, ๋ฌดํŠผ, ์ด์ง„ ํƒ์ƒ‰์€ ๋‹จ์ˆœํžˆ ํƒ์ƒ‰ ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์ตœ์ ํ™” ๋ฌธ์ œ์—๋„ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ƒ๊ฐํ•ด ๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. (์ž์„ธํ•œ ํŒจํ„ด์€ ๋’ค์—์„œ ๋‹ค๋ฃจ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค)

 

 


 

 

์ด์ง„ ํƒ์ƒ‰ ์„ค๋ช…

 

์ด์ œ๋ถ€ํ„ฐ๋Š” ์ •๋ ฌ๋œ ๋ฐฐ์—ด  arr  ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒ ๋‹ค. ์ •๋ ฌ๋œ ๋ฐฐ์—ด   arr  ์™€ ๊ฐ’   ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•˜์ž, ๊ทธ๋Ÿฌ๋ฉด $O(\log n)$์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ $O(1)$์˜ ๊ณต๊ฐ„ ๋ณต์žก๋„๋กœ ์ด์ง„ ํƒ์ƒ‰์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค:

 

  •   arr  ๋‚ด์— ์กด์žฌํ•˜๋Š”   x  ์˜ index
  •   x  ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ๋„ ์ •๋ ฌ์ด ์œ ์ง€๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š”   arr  ๋‚ด์˜ ์œ„์น˜ (index)

 

์ด์ง„ ํƒ์ƒ‰์˜ ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 


 

  arr   ๋‚ด์— ์›ํ•˜๋Š” ๊ฐ’   ์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด   x  ๋Š”   arr   ๋‚ด์˜ ์–ด๋”˜๊ฐ€์— ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด   arr[idx] = x๋ฅผ ๋งŒ์กฑํ•˜๋„๋ก ํ•˜๋Š”   idx  ๊ฐ€ ์žˆ๊ณ , ์ด ๊ฐ’์€   0 <= idx <= len(arr)-1์„ ๋งŒ์กฑํ•  ๊ฑฐ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ฐพ์•„๋ณด์ž. ์–ด๋””์„œ๋ถ€ํ„ฐ ์ฐพ์„๊นŒ ๊ณ ๋ฏผํ•˜์ง€ ๋ง๊ณ  ์ผ๋‹จ ์กด์žฌ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„ ์ค‘์—์„œ ๊ฐ€์šด๋ฐ๋ฅผ ๋จผ์ € ์ฐ”๋Ÿฌ๋ณด์ž. ๋‹ค์‹œ ๋งํ•ด,   arr  ์˜ ์ค‘๊ฐ„ ๊ฐ’์„ ๋จผ์ € ํ™•์ธํ•œ๋‹ค. ์ค‘๊ฐ„ ๊ฐ’์„   arr[mid]  ๋ผ๊ณ  ํ•  ๋•Œ,   arr[mid]  ๊ฐ€ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’   x  ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋‚ด๊ฐ€ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์€   mid +1 <= idx <= len(arr)-1  ์‚ฌ์ด์— ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ํƒ์ƒ‰ํ•˜๋Š” ๋ฒ”์œ„๋ฅผ  mid +1 <= idx <= len(arr)-1๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์‹œ ํ•œ๋ฒˆ ํ•ด๋‹น ๋ฒ”์œ„์—์„œ ์ค‘๊ฐ„ ๊ฐ’์„ ๋ฐฉ๋ฌธํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค. (๋ฐ˜๋Œ€๋กœ ์ค‘๊ฐ„ ๊ฐ’์ด ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’๋ณด๋‹ค ์ปธ๋‹ค๋ฉด ํƒ์ƒ‰ ๋ฒ”์œ„๋Š” 0 <= idx <= mid-1 ์œผ๋กœ ์„ค์ •๋œ๋‹ค.) (ํ˜น์€, ์šฐ์—ฐ์ฐฎ๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๊ณ ์ž ํ–ˆ๋˜ ๊ฐ’๊ณผ ๊ฐ™์•˜๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ mid ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.) ์ด ๊ณผ์ •์ด ๊ฒฐ๊ตญ ๋ฐ˜๋ณต๋˜๋Š” ํ˜„์ƒ์ž„์„ ์ธ์ง€ํ•˜์˜€๋Š”๊ฐ€?


 

์ด ์•„์ด๋””์–ด๋ฅผ ๊ตฌ์ฒดํ™”ํ•ด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์˜ฎ๊ฒจ๋ณด์ž.

 

์ž ๋จผ์ €, ํƒ์ƒ‰์˜ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๋ฅผ ๋„์ž…ํ•˜์ž. ์™ผ์ชฝ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๋ฅผ   left  , ์˜ค๋ฅธ์ชฝ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๋ฅผ   right  ๋ผ๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค:

 

  1.   left = 0  ,   right = len(arr) - 1  ์ฐธ๊ณ ๋กœ, ์ง€๊ธˆ ์ด ๋ณ€์ˆ˜๋Š” ํƒ์ƒ‰ ์˜์—ญ์—์„œ ๋“ฑํ˜ธ๊ฐ€ ํฌํ•จ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์ง€ ๋ง์ž (inclusive)
  2. ์šฐ๋ฆฌ๋Š” ํƒ์ƒ‰์˜ ๋ฒ”์œ„๊ฐ€ ์œ ํšจํ•  ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ• ๊ฑฐ๋‹ค.
    while   arr  <=   right  :
    •  ํ™•์ธํ•  ๊ฐ€์šด๋ฐ ๊ฐ’์˜ index ์—ฐ์‚ฐํ•˜๊ธฐ   mid = (left + right) // 2  
    •   arr[mid]  ๊ฐ’ ํ™•์ธํ•˜๊ธฐ:
      •  if arr[mid] == x : ์ฐพ์•˜๋‹ค! return
      •  if arr[mid] > x : x ๊ฐ’์€ ์ด๋ณด๋‹ค ์ž‘์€ ๋ฒ”์œ„์— ์กด์žฌํ•˜๋‹ˆ๊นŒ ์˜ค๋ฅธ์ชฝ ๋ฒ”์œ„๋ฅผ ์ค„์—ฌ์ฃผ์ž  right = mid - 1  .
      •  if arr[mid] < x : x ๊ฐ’์€ ์ด๋ณด๋‹ค ํฐ ๋ฒ”์œ„์— ์กด์žฌํ•˜๋‹ˆ๊นŒ ์™ผ์ชฝ ๋ฒ”์œ„๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ž  left = mid + 1  .

 

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฒฝ์šฐ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ 1/2๋กœ ๊ณ„์†ํ•ด์„œ ์ค„์—ฌ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ $O(\log n)$์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 


 

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

arrary ๋‚ด์— ์ค‘๋ณต๋œ ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ

def binarySearch(arr, x):

    left, right = 0, len(arr)-1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == x:
	        # do something with this
            return
        if arr[mid] > x:
            right = mid - 1
        else:
            left = mid + 1
    
    # if x is not in arr, left is the proper insertion point
    return left

 

arrary ๋‚ด์— ์ค‘๋ณต๋œ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ

 

ํƒ€๊ฒŸ ๊ฐ’  x  ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ œ์ผ ์•ž์— ์žˆ๋Š”   x  ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ์•ผ ํ• ๊นŒ? ์•„๋‹ˆ๋ฉด ์ œ์ผ ๋’ค์— ์žˆ๋Š”   x  ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ์•ผ ํ• ๊นŒ? ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์งˆ ๊ฒƒ์ด๋‹ค. ์ œ์ผ ์™ผ์ชฝ์˜   x  ์˜ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ์ œ์ผ ์˜ค๋ฅธ์ชฝ์˜   x  ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์— ๋Œ€ํ•œ template์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

 

 

 

๋จผ์ €, left-most index๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž.

 

์ผ๋‹จ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ด์ง ๋ณ€ํ˜•ํ•  ๊ฒƒ์ด๋‹ค. ์•ž์—์„œ์™€ ๋‹ฌ๋ฆฌ, ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ left <= idx < right ๋กœ ์ˆ˜์ •ํ•˜์ž. (์˜ค๋ฅธ์ชฝ ๋“ฑํ˜ธ๋ฅผ ์—†์•ด์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ, ์•ž์—์„œ๋Š” left <= idx <= right ์˜€๋‹ค) ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€๋กœ, ์•ž์—์„œ๋Š” arr[mid] == x ์ธ ๊ฒฝ์šฐ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค๋ฉด, ์ด๋ฒˆ์—๋Š” ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์ด mid ๊ฐ’์„ ์ƒˆ๋กœ์šด ํƒ์ƒ‰ ๋ฒ”์œ„๋กœ ์ง€์ •ํ•ด ์ค„ ๊ฒƒ์ด๋‹ค.

 

def binarySearch(arr, x):

    left, right = 0, len(arr)
    while left < right:
        mid = (left + right) // 2
        if arr[mid] >= x:
            right = mid
        else:
            left = mid + 1
    
    return left

 

 

์•ž์„  ๊ฒฝ์šฐ์™€ ๋‹ฌ๋ฆฌ ์—ฌ๊ธฐ์„œ๋Š” ํƒ์ƒ‰ ๋ฒ”์œ„์—์„œ ์˜ค๋ฅธ์ชฝ์˜ ๋“ฑํ˜ธ๋ฅผ ๋นผ๋ฒ„๋ ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ขํžŒ ๋’ค, ํƒ์ƒ‰ ๋ฒ”์œ„์˜ ์™ผ์ชฝ ๊ฐ’์„ ์ตœ์ข…์ ์ธ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต๋œ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๊ฐ™์€ ๊ฐ’์ด ์žˆ์„ ๋Œ€ ์ œ์ผ ์™ผ์ชฝ ๊ฐ’๊นŒ์ง€ ํƒ์ƒ‰์„ ๊ณ„์†ํ•œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ์•ž์„  ๋ฒ„์ „ (์ค‘๋ณต ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ)๊ณผ ๋‹ฌ๋ผ์ง„ ์ ์„ ์ •๋ฆฌํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

 

  • ์•ž์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํƒ์ƒ‰ ๋ฒ”์œ„์—์„œ ์˜ค๋ฅธ์ชฝ ๋“ฑํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—  right  ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋‹ฌ๋ผ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (์•ž์„  ๋ฒ„์ „์—์„œ๋Š”  right = len(arr) - 1  ๋กœ ์ดˆ๊ธฐํ™” ํ–ˆ์—ˆ๋‹ค!)
  • ์•ž์„œ์„œ ๋ฒ”์œ„ ์ฒดํฌ์—์„œ  while left <= right ๋ฅผ ์œ ํšจ ๋ฒ”์œ„๋กœ ๋ดค๋˜ ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ while left < right  while ์กฐ๊ฑด๋ฌธ์—์„œ๋„ ๋“ฑํ˜ธ๊ฐ€ ๋น ์ง„๋‹ค. (์กฐ๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. left <= idx < left ๋Š” ์œ ํšจํ•œ ๋ฒ”์œ„๊ฐ€ ์•„๋‹ˆ๋‹ค!)
  •  if arr[mid] > x  ์ธ ๊ฒฝ์šฐ์™€  if arr[mid] == x ๋ฅผ ๋ชจ๋‘ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์ฃผ๊ณ  ์žˆ๋‹ค. ํ•œ๋งˆ๋””๋กœ, ๊ฐ™์€ ๊ฐ’์ธ ๊ฒฝ์šฐ์—๋„ ํƒ์ƒ‰์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ์ œ์ผ ์™ผ์ชฝ ๊ฐ’์„ ์ฐพ๊ธฐ๊นŒ์ง€ ํƒ์ƒ‰์„ ์ด์–ด๊ฐ€๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  •  if arr[mid] >= x  ์ผ ๋•Œ์˜ right ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์กŒ๋‹ค. ์ด์ „์—๋Š”  right = mid + 1  ์ด์—ˆ์ง€๋งŒ, ์ด์ œ๋Š”  right = mid ์ด๋‹ค. (์ด ์—ญ์‹œ ์œ ํšจ๋ฒ”์œ„ ์˜ค๋ฅธ์ชฝ์— ๋“ฑํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด ๋ณด๋ฉด trivial ํ•˜๋‹ค)

 

ํ•œ ๊ฐ€์ง€ ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด ํ•˜๋‚˜๋ฐ–์— ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ๋™์ž‘ํ•˜๋Š”๊ฐ€? ๋‹ต์€ "๊ทธ๋ ‡๋‹ค"์ด๋‹ค. [1,2,3] ์ธ ๋ฐฐ์—ด์— ๋Œ€ํ•ด 2๊ฐ€ target์ธ ๊ฒฝ์šฐ๋ฅผ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•ด ๋ณด์ž. left = 0, right = 3์ด ๋˜๊ณ , mid = 1์ด ๋œ๋‹ค.

 

1) while 1 < 3, mid = 1, arr[mid] = 2 == 2 ์ด๋ฏ€๋กœ right = 1์ด ๋œ๋‹ค.

2) while 1 < 1์ด ๋˜์–ด๋ฒ„๋ ค์„œ ํƒ์ƒ‰์ด ๋” ์ด์ƒ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  while๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค

3) return 1 <-- ์ •๋‹ต์ž…๋‹ˆ๋‹ค !

 

 

 

 

์ด์ œ, right-most index๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

 

์•ž์˜ ๊ฒฝ์šฐ์™€ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ์—†๋‹ค. ๋Œ€์‹ , ์ด์ „์—๋Š” ํƒ€๊ฒŸ ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— right ์˜ ๋ฒ”์œ„๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ขํ˜€์คฌ๋‹ค๋ฉด, ์ด์ œ ํƒ€๊ฒŸ ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ left์˜ ๋ฒ”์œ„๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋๊นŒ์ง€ ์ขํ˜€์ค„ ๊ฑฐ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ตœ์ข…์ ์œผ๋กœ left <= idx < right์˜ ๋ฒ”์œ„์—์„œ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ํƒ€์ดํŠธํ•œ left๋ฅผ ์ฐพ๊ฒŒ ๋˜๊ณ , left๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

def binarySearch(arr, x):

    left, right = 0, len(arr)
    while left < right:
        mid = (left + right) // 2
        if arr[mid] > x:
            right = mid
        else:
            left = mid + 1
    
    return left

 


์ฃผ์š” ํŒจํ„ด ์„ค๋ช…์€ ๋‹ค์Œ์—...

 

์•ž์—์„œ ์˜ˆ์ œ๋กœ ์ž ๊น ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด์ง„ ํƒ์ƒ‰์€ ๋‹จ์ˆœํžˆ ํƒ์ƒ‰์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ๋„ ์‚ฌ์šฉ๋œ๋‹ค. ํฌ๊ฒŒ ๋‚˜๋ˆ„์–ด ์ด์•ผ๊ธฐํ•ด ๋ณด์ž๋ฉด ์ด์ง„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํŒจํ„ด์—๋Š” ๋ฐฐ์—ด์—์„œ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”  min/max ๊ฐ’์„ ์ฐพ๋Š” ๋ฌธ์ œ๋“ค ์ค‘ solution space๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

๋‘ ๊ฐœ์˜ ๋Œ€ํ‘œ์ ์ธ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ์— ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ๋‹ค. (์ƒˆ๋กœ ๊ธ€ ์ž‘์„ฑํ•˜๋Š” ๋Œ€๋กœ ๋ณธ ํฌ์ŠคํŒ…์— ๋ฐฑ๋งํฌ ๊ฑธ์–ด๋‘˜๊ฒŒ์š”)

 

๋ โ—ผ๏ธŽ

 

 

 

 

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.