[ํŒŒ์ด์ฌ/python] ์ด์ง„ ํƒ์ƒ‰ (Binary Search)

2021. 3. 17. 17:20

์ด์ง„ ํƒ์ƒ‰์ด๋ž€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์›ํ•˜๋Š” ์ˆซ์ž๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๋ฐ˜๋“œ์‹œ ์ •๋ ฌ๋œ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•ด์•ผํ•˜๊ณ  ๋กœ๊ทธ์‹คํ–‰์‹œ๊ฐ„(O(log N))์„ ๋ณด์žฅํ•œ๋‹ค.

 

  • target : ์ฐพ์„ ๊ฐ’
  • start : ์‹œ์ž‘ ์ธ๋ฑ์Šค
  • end : ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค
  • pivot : ์ค‘๊ฐ„ ์ธ๋ฑ์Šค

์œ„ 4๊ฐ€์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

๋ฆฌ์ŠคํŠธ์˜ ์ค‘๊ฐ„ ์ธ๋ฑ์Šค pivot ๊ฐ’์ด ์ฐพ๊ณ ์žํ•˜๋Š” ๊ฐ’ target๊ณผ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋ฉด์„œ ์ง„ํ–‰๋œ๋‹ค.

๊ฐ™์ง€ ์•Š๋‹ค๋ฉด start ๊ฐ’๊ณผ end ๊ฐ’์„ ์ ์ ˆํžˆ ์กฐ์ ˆํ•˜์—ฌ pivot ๊ฐ’์„ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ๋‹ค์‹œ target๊ณผ ๋น„๊ตํ•œ๋‹ค.

์œ„๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค ๋ฒ”์œ„๊ฐ€ ๋ฐ˜์”ฉ ์ค„์–ด๋“ค๊ฒŒ๋˜๋ฏ€๋กœ logN์˜ ์‹œ๊ฐ„์„ ๊ฐ–๋Š”๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด 1๋ถ€ํ„ฐ 10๊นŒ์ง€์˜ ์ˆ˜ ์ค‘ target 8์„ ์ฐพ์œผ๋ ค ํ•œ๋‹ค.

1์„ start๋กœ 10์„ end๋กœ ์„ค์ •ํ•˜๊ณ  ๊ทธ ์ค‘๊ฐ„ ๊ฐ’์ธ 5๋ฅผ pivot์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

5์™€ 8์ด ๊ฐ™์ง€ ์•Š์œผ๋ฏ€๋กœ start ๊ฐ’์„ pivot๋ณด๋‹ค ํฌ๊ฒŒ ์กฐ์ ˆํ•˜์—ฌ ๋ฒ”์œ„๋ฅผ ์ค„์ธ๋‹ค.

 

start๋ฅผ 6์œผ๋กœ ๋ฐ”๊พธ๊ณ  end๋Š” ๊ทธ๋Œ€๋กœ 10์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋Ÿผ ๊ทธ ์ค‘๊ฐ„ ๊ฐ’์ธ 8์ด pivot์ด ๋œ๋‹ค.

pivot 8๊ณผ target 8์ด ๊ฐ™์œผ๋ฏ€๋กœ ์ด์ง„ํƒ์ƒ‰์ด ๋๋‚œ๋‹ค.

 

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

while end >= start:
        pivot = (end + start) // 2
        
        if pivot < target:   
            start = pivot + 1

        elif pivot > target: 
            end = pivot - 1

        else:
            break

end๊ฐ’๊ณผ start๊ฐ’์ด ๊ณ„์† ๋ฐ”๋€Œ๋ฏ€๋กœ start ๊ฐ’์ด end ๊ฐ’์„ ๋„˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

pivot์„ ์ค‘๊ฐ„๊ฐ’์œผ๋กœ ์žก์•„์ฃผ๊ณ  target๊ณผ ๋น„๊ตํ•œ๋‹ค.

๋งŒ์•ฝ pivot ๊ฐ’์ด ๋” ์ž‘๋‹ค๋ฉด target์˜ ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ๊ฐ’์€ pivot +1์ด๋ฏ€๋กœ start๋ฅผ pivot + 1๋กœ ์„ค์ •ํ•œ๋‹ค.

๋งŒ์•ฝ pivot ๊ฐ’์ด ๋” ํฌ๋‹ค๋ฉด target์˜ ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€๊ฐ’์€ pivot - 1์ด๋ฏ€๋กœ end๋ฅผ pivot - 1๋กœ ์„ค์ •ํ•œ๋‹ค.

pivot ๊ฐ’๊ณผ target ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด break๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณต๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐ„๋‹ค.

728x90

BELATED ARTICLES

more