Coding Test

์ด์ง„ ํƒ์ƒ‰ (Binary Search) ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์™œ logn์ผ๊นŒ?

fram 2024. 3. 8. 00:34
    public static int search(int[] nums, int target) {
        int start = 0, end = nums.length - 1;

        while(start <= end) {
            int mid = (start + end) / 2;

            if(nums[mid] == target) {
                return mid;
            }

            if(nums[mid] < target) {
                start = mid + 1;
            } else {
                end = end - 1;
            }
        }

        return -1; // target ์—†์Œ
    }

 

์ด์ง„ ํƒ์ƒ‰์€ divide and conquer์˜ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(logn)์ด ๋˜๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ N๊ฐœ๋ผ๋ฉด N๊ฐœ ๋ชจ๋‘๊ฐ€ ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ๋œ๋‹ค. ๊ทธ ์ดํ›„ 
๋‹ค์Œ ํƒ์ƒ‰์—์„œ ํƒ์ƒ‰ ๋ฒ”์œ„๋Š” ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด N/2 ๊ฐ€ ๋˜๊ณ  ๊ทธ ๋‹ค์Œ ํƒ์ƒ‰์—์„œ ํƒ์ƒ‰ ๋ฒ”์œ„๋Š” ๋˜ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด N/4๊ฐ€ ๋˜๊ณ  ๊ทธ ๋‹ค์Œ์€ N/8, N/16 ์ด ๋˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ k ๋ผ๋ฉด N๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ N = 2^k๊ฐ€ ๋œ๋‹ค. 

k์˜ ๊ฐ’์„ ๊ตฌํ•˜๋ ค๋ฉด k = log2(N)์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋กœ๊ทธ๊ฐ€ ์•ฝํ•œ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ํŒ

log2(8) ์€ 2๋ฅผ ๋ช‡ ์ œ๊ณฑ ํ•ด์•ผ 8์ด๋ผ๋Š” ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋А๋ƒ๋Š” ๋œป์ด๋‹ค. log2(2^3) ์ด๋ฉฐ ์ด๋Š” 3log2(2)๋กœ ํ‘œํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

log2(2), log3(3) ... ๋“ฑ์€ ๊ฐ’์ด ์ผ์ด๋ฏ€๋กœ 3log2(2) = 3 ์ด ๋œ๋‹ค. 

์ฆ‰ 2^3 = 8 ์ด๊ณ  3 = log2(8)์ด ๋œ๋‹ค. 

์œ„์—์„œ ํƒ์ƒ‰ ๋ฒ”์œ„๋Š” 2^k = N  ์ด๋ฏ€๋กœ ์ด๋ฅผ ๋กœ๊ทธ๋กœ ํ‘œํ˜„ํ•˜๋ฉด k = log2(N)์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค!