Coding Test/Codility

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

chamroro 2025. 3. 2. 16:24

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. ์ด์ง„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•œ ์ตœ์ ํ™” ๋ฌธ์ œ ํ•ด๊ฒฐ ํŒจํ„ด

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

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

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

๋ฐ˜์‘ํ˜•