14. ์ด์ง„ ํƒ์ƒ‰ (Binary Search) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.)

    1. ์ด์ง„ ํƒ์ƒ‰(Binary Search)์ด๋ž€?

    ์ด์ง„ ํƒ์ƒ‰์€ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ํŠน์ • ๊ฐ’์„ ์ฐพ๋Š” ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œผ๋กœ, O(log n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๋ฉด์„œ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, 1๋ถ€ํ„ฐ 16๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘์—์„œ ๋ชฉํ‘œ ์ˆซ์ž๋ฅผ ์ฐพ๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ๋‹จ์ˆœ ์„ ํ˜• ํƒ์ƒ‰(linear search)์œผ๋กœ๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ 16๋ฒˆ์˜ ๋น„๊ต๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ์ด์ง„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ๋Œ€ 4๋ฒˆ์˜ ๋น„๊ต๋งŒ์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.


    2. O(log n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์ด์ง„ ํƒ์ƒ‰ ๊ตฌํ˜„

    JavaScript ์ฝ”๋“œ:

    function binarySearch(A, x) {
        let left = 0, right = A.length - 1;
        while (left <= right) {
            let mid = Math.floor((left + right) / 2);
            if (A[mid] === x) return mid;
            else if (A[mid] < x) left = mid + 1;
            else right = mid - 1;
        }
        return -1;
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(log n) (๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ค„์ด๋ฏ€๋กœ)

    ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค:

    1. ๋ฐฐ์—ด์˜ ์ค‘์•™๊ฐ’์„ ์„ ํƒํ•œ๋‹ค.
    2. ์ฐพ๋Š” ๊ฐ’ x๊ฐ€ ์ค‘์•™๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ ์ ˆ๋ฐ˜์„ ํƒ์ƒ‰ํ•˜๊ณ , ์ž‘์œผ๋ฉด ์™ผ์ชฝ ์ ˆ๋ฐ˜์„ ํƒ์ƒ‰ํ•œ๋‹ค.
    3. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.

    3. ์ด์ง„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•œ ์ตœ์  ๊ฐ’ ์ฐพ๊ธฐ (Binary Search on the Result)

    ์ด์ง„ ํƒ์ƒ‰์€ ๋‹จ์ˆœํ•œ ์ˆซ์ž ๊ฒ€์ƒ‰๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ตœ์ ์˜ ๊ฐ’์„ ์ฐพ๋Š” ๋ฌธ์ œ ์—๋„ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธธ์ด๊ฐ€ n์ธ ์ง€๋ถ•์— 0๊ณผ 1๋กœ ํ‘œ์‹œ๋œ ๊ตฌ๋ฉ์ด ์žˆ๊ณ , k ๊ฐœ์˜ ๋™์ผํ•œ ํฌ๊ธฐ์˜ ํŒ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ตฌ๋ฉ์„ ๋ฎ์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. ์ด๋•Œ, ํŒ์ž์˜ ์ตœ์†Œ ํฌ๊ธฐ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.

    JavaScript ์ฝ”๋“œ:

    function boards(A, k) {
        let n = A.length;
        let left = 1, right = n, result = -1;
        
        while (left <= right) {
            let mid = Math.floor((left + right) / 2);
            if (check(A, mid) <= k) {
                right = mid - 1;
                result = mid;
            } else {
                left = mid + 1;
            }
        }
        return result;
    }
    

    ์ด ์ฝ”๋“œ๋Š” check(A, mid) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์–ด์ง„ ํฌ๊ธฐ์˜ ํŒ์ž๋กœ ๋ชจ๋“  ๊ตฌ๋ฉ์„ ๋ฎ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋ฒ”์œ„๋ฅผ ์ขํ˜€๊ฐ€๋ฉฐ ์ตœ์ ์˜ ํฌ๊ธฐ๋ฅผ ์ฐพ๋Š” ๋ฐฉ์‹์ด๋‹ค.


    4. ํŒ์ž๊ฐ€ ์ถฉ๋ถ„ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜ (Greedy Check)

    ์ด์ œ, ํŠน์ • ํฌ๊ธฐ์˜ ํŒ์ž๋กœ ๋ชจ๋“  ๊ตฌ๋ฉ์„ ๋ฎ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด์ž.

    JavaScript ์ฝ”๋“œ:

    function check(A, k) {
        let n = A.length;
        let boards = 0, last = -1;
        
        for (let i = 0; i < n; i++) {
            if (A[i] === 1 && last < i) {
                boards++;
                last = i + k - 1;
            }
        }
        return boards;
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) (๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉฐ ํ•„์š”ํ•œ ํŒ์ž ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐ)

    ์ด ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์„ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด์„œ, ์•„์ง ๋ฎ์ด์ง€ ์•Š์€ ๊ตฌ๋ฉ์ด ๋‚˜์˜ค๋ฉด ์ƒˆ๋กœ์šด ํŒ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.


    5. ์ด์ง„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•œ ์ตœ์ ํ™” ๋ฌธ์ œ ํ•ด๊ฒฐ ํŒจํ„ด

    ์ด์ง„ ํƒ์ƒ‰์€ ๋‹จ์ˆœํ•œ ๊ฐ’ ๊ฒ€์ƒ‰ ์™ธ์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค:

    • ์ตœ์ ์˜ ํฌ๊ธฐ ์ฐพ๊ธฐ (์˜ˆ: ์œ„์˜ ์ง€๋ถ• ๊ตฌ๋ฉ ๋ฌธ์ œ)
    • ์ตœ์†Œ/์ตœ๋Œ€ ๋น„์šฉ ๊ณ„์‚ฐ (์˜ˆ: ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ์†Œ ๋น„์šฉ ์ฐพ๊ธฐ)
    • ์‹œ๊ฐ„ ์ตœ์ ํ™” (์˜ˆ: ๊ฐ€์žฅ ์งง์€ ์‹œ๊ฐ„ ๋‚ด์— ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐฉ๋ฒ• ์ฐพ๊ธฐ)

    ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์€ ๋ณดํ†ต ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ์†Œ/์ตœ๋Œ€ ๊ฐ’์„ ์ฐพ๋Š” ํ˜•ํƒœ ๋กœ ๋ณ€ํ˜•ํ•˜์—ฌ ์ด์ง„ ํƒ์ƒ‰์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€