์ด์ง„ ํƒ์ƒ‰ (Binary Search)

์ด ๊ธ€์˜ ๋ชฉ์ฐจ5๊ฐœ
  1. ๐Ÿ“Œ ์ด์ง„ ํƒ์ƒ‰ ๊ฐœ๋…
  2. ๐Ÿ›  ํƒ์ƒ‰ ๊ณผ์ •
  3. ๐Ÿ–ฅ๏ธ ์˜ˆ์‹œ : 34๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•  ๋•Œ
  4. โฐ ์‹œ๊ฐ„๋ณต์žก๋„
  5. ์ฝ”๋“œ (Java)

๐Ÿš€ ์ด์ง„ ํƒ์ƒ‰ (Binary Search)

์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ํŠน์ • ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ค„์—ฌ๊ฐ€๋ฉฐ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.

๐Ÿ“Œ ์ด์ง„ ํƒ์ƒ‰ ๊ฐœ๋…

  • ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ค„์—ฌ ๋น ๋ฅด๊ฒŒ ๊ฐ’์„ ์ฐพ์Œ

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(log N) โ†’ ๋งค์šฐ ํšจ์œจ์ !

์กฐ๊ฑด : ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผํ•จ

๐Ÿ›  ํƒ์ƒ‰ ๊ณผ์ •

  1. ์ขŒ์ธก ์ธ๋ฑ์Šค (left) ์„ค์ • / ์ดˆ๊ธฐ ์„ค์ •์€ array์˜ ์‹œ์ž‘ (0 index)

  2. ์šฐ์ธก ์ธ๋ฑ์Šค (right) ์„ค์ • / ์ดˆ๊ธฐ ์„ค์ •์€ array์˜ ๋งˆ์ง€๋ง‰ index

  3. ์ค‘๊ฐ„ ์ธ๋ฑ์Šค (min) ์„ค์ • / (left + right) / 2 ๋กœ ๊ฐฑ์‹ 

๋ฒ”์œ„์˜ ์ค‘๊ฐ„ ๊ฐ’์„ ํ™•์ธํ•˜์—ฌ ํƒ€๊ฒŸ ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ž‘์œผ๋ฉด right ํ˜น์€ left ๊ฐ’์„ mid๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

๐Ÿ–ฅ๏ธ ์˜ˆ์‹œ : 34๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•  ๋•Œ

**1. ์ „์ฒด ๋ฒ”์œ„์—์„œ ์ค‘๊ฐ„๊ฐ’์„ ํ™•์ธํ•œ๋‹ค. **

์ด ๋•Œ, ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์€ 34์ด๊ณ  mid๊ฐ’์€ 27์ด๋ฏ€๋กœ ํ˜„์žฌ์˜ ์ค‘๊ฐ„๊ฐ’์€ ํƒ€๊ฒŸ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฒ”์œ„๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ขํ˜€์•ผํ•œ๋‹ค.

left = mid + 1, mid = (left + right) / 2๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.

2. ๋‹ค์Œ ์ค‘๊ฐ„๊ฐ’์€ 38์ด๋‹ค. ํƒ€๊ฒŸ ๊ฐ’์€ 34์ด๊ณ  ์ค‘๊ฐ„๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ๋ฒ”์œ„๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ขํžŒ๋‹ค. right = mid - 1, mid = (left + right) / 2๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.

3. ์ค‘๊ฐ„๊ฐ’์€ 30์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ์ขํžŒ๋‹ค.

4. ํ˜„์žฌ left, mid, right๊ฐ€ ๊ฐ™์€ ์ธ๋ฑ์Šค๋กœ ์„ค์ •๋˜์—ˆ๋‹ค. ํ˜„์žฌ ์ค‘๊ฐ„๊ฐ’์€ ํƒ€๊ฒŸ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๊ธฐ์— ํƒ€๊ฒŸ๊ฐ’์ด ๋ช‡ ๋ฒˆ ์ธ๋ฑ์Šค์— ์œ„์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์˜€๋‹ค.

์ด์ฒ˜๋Ÿผ ์ด์ง„ํƒ์ƒ‰์€ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์ ์€ ๊ณ„์‚ฐ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ํƒ€๊ฒŸ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ,

์—ฌ๊ธฐ์„œ right = mid - 1 ํ˜น์€ left = mid + 1์ฒ˜๋Ÿผ ์ƒˆ๋กœ์šด ๋ฒ”์œ„๋ฅผ ๊ธฐ์กด mid ์ธ๋ฑ์Šค ๋ณด๋‹ค 1 ๋” ๋†’๊ฑฐ๋‚˜ ๋‚ฎ์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ํŠน์ง• ๋•๋ถ„์— ์ฐพ์œผ๋ ค๋Š” ํƒ€๊ฒŸ ๊ฐ’์ด ๋ฐฐ์—ด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (ํƒ€๊ฒŸ ๊ฐ’์ด ๋ฐฐ์—ด์—์„œ ๋ช‡ ๋ฒˆ์งธ๋กœ ํฐ์ง€ ํ™•์ธํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๋Š” ์ƒํ™ฉ ๋“ฑ)

์ด ๋•Œ, ๋ฐ˜๋ณต๋ฌธ์˜ ์กฐ๊ฑด์„ left <= right๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฐฐ์—ด์— ํƒ€๊ฒŸ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ฐฐ์—ด์— ๋ช‡ ๋ฒˆ์งธ๋กœ ํฐ ๊ฐ’์ด ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์™€๊ฐ™์€ ์ƒํ™ฉ์ผ ๋•Œ ํƒ€๊ฒŸ ๊ฐ’์ด 36์ด๋ผ๊ณ  ํ•ด๋ณด์ž.

์ค‘๊ฐ„๊ฐ’์€ 34์ด์ง€๋งŒ ํƒ€๊ฒŸ ๊ฐ’์€ 36์ด๋ฏ€๋กœ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ขํ˜€์•ผ ํ•œ๋‹ค.

ํ˜„์žฌ left, mid, right๊ฐ€ ๊ฐ™์€ ์ธ๋ฑ์Šค์ธ ์ƒํ™ฉ์—์„œ left = mid + 1๋กœ ๊ฐฑ์‹ ํ•˜๊ฒŒ ๋˜๋ฉด left๊ฐ€ right๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ์— ์กด์žฌํ•˜๋Š” ์ƒํ™ฉ์ด ๋œ๋‹ค.

์ด ๋•Œ ๋ฐ˜๋ณต๋ฌธ์˜ ์กฐ๊ฑด left <= right ์—์„œ false๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ์ด๋Š” ๋ฐฐ์—ด์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํƒ€๊ฒŸ ๊ฐ’์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ธ๋ฑ์Šค์— ๋„์ฐฉํ–ˆ๋‹ค๋Š” ๋œป์ด ๋œ๋‹ค.

๊ณ ๋กœ ํ˜„์žฌ์˜ left์ธ๋ฑ์Šค (ํ˜„์žฌ ๊ฐ’ : 38) ๋ถ€๋ถ„์— 36์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

โฐ ์‹œ๊ฐ„๋ณต์žก๋„

for๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๋น„๊ตํ•  ๋•Œ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ์ด์ง„ํƒ์ƒ‰์„ ๋น„๊ตํ•ด๋ณด์ž.

์ด ๋•Œ, ์ตœ์•…์˜ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ฐฐ์—ด ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ํƒ€๊ฒŸ ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค.

์„ ํ˜• ํƒ์ƒ‰์€ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋งŒํผ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ด์ง„ํƒ์ƒ‰์€ O(log N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

๋ฐฐ์—ด์„ ์ ˆ๋ฐ˜์œผ๋กœ ์ชผ๊ฐœ๋Š” ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—

๋ฐฐ์—ด์˜ ๊ธธ์ด N์„ 2๋กœ ๋ฌดํ•œํžˆ ๋‚˜๋ˆ„์–ด 1์ด ๋  ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ log N์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

์ฝ”๋“œ (Java)

for(int i=0;i<dp.length;i++){
            for(int j=0;j<i;j++){
                if(arr[j]<arr[i]){
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }
์ „์ฒด ๊ธ€ ๋ณด๊ธฐ