๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/์•Œ๊ณ ๋ฆฌ์ฆ˜

์ค‘๋ณต๋œ ์›์†Œ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ด์ง„ ํƒ์ƒ‰ (Binary Search)

interfacer_han 2023. 11. 7. 15:27

#1 ์•Œ๊ณ ๋ฆฌ์ฆ˜

#1-1

 

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

#1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ ‡๊ฒŒ ํ•ด์„œ x์˜ ์ธ๋ฑ์Šค i๋ฅผ ์ฐพ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ์ด x๊ฐ€ ๋ฐฐ์—ด values ์–ด๋””์—๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ๊ฒฝ์šฐ์—” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ? ์—… ์•ค ๋‹ค์šด ๊ฒŒ์ž„์€ ์šฐ๋ฆฌ๋‚˜๋ผ์—์„  ์†Œ์ฃผ

kenel.tistory.com

ํ•ด๋‹น ๊ธ€์—์„œ ์ด์–ด์ง„๋‹ค.

 

#1-2

 

#1-3

์ค‘๋ณต๋œ ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ์˜ ์ด์ง„ ํƒ์ƒ‰์—์„  min < max๊ฐ€ ๋˜๋Š” ์‹œ์ ์ด while์˜ ํƒˆ์ถœ ์‹œ์ ์ด์—ˆ๋‹ค. ๋ฐ˜๋ฉด, ์ค‘๋ณต๋œ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ด์ง„ ํƒ์ƒ‰์—์„  min = max๊ฐ€ ๋˜๋Š” ์‹œ์ ์ด while์˜ ํƒˆ์ถœ ์‹œ์ ์ด๋‹ค. min = max๋Š” ๊ฒ€์ƒ‰ ๋ฒ”์œ„๊ฐ€ i์— ์ตœ๋Œ€๋กœ ์ ‘๊ทผ ์ฆ‰, ์•„์˜ˆ ๊ฐ™์€ ๊ฐ’์ด ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

 

#1-4

binarySearch() ๋Œ€๋น„ binarySearchFirstIndex() ๋˜๋Š” binarySearchLastIndex()์—์„œ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋นจ๊ฐ›๊ฒŒ ๊ฐ•์กฐ ํ‘œ์‹œํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋‚ฉ๋“์ด ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ๋ณด์ธ๋‹ค. ๋ฐ”๋กœ binarySearchLastIndex()์—์„œ mid = (min + max) / 2์— ๊ทธ์น˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€๋กœ 1์„ ๋”ํ•œ ๋ถ€๋ถ„์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ binarySearchFirstIndex()๋Š” mid๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ด binarySearch()์™€ ๋˜‘๊ฐ™์€๋ฐ binarySearchLastIndex() ํ˜ผ์ž๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์€ ๋”๋”์šฑ ์˜์•„ํ•˜๋‹ค.

 

#1-5

binarySearchLastIndex()์˜ mid์— ์ถ”๊ฐ€๋กœ 1์„ ๋”ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. min๊ณผ max๊ฐ€ ์˜์›ํžˆ ๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์ด binarySearchLastIndex()์˜ return์„ ๋ฌดํ•œํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์ด ์ƒํ™ฉ์€ intํ˜•๋ผ๋ฆฌ์˜ / ์—ฐ์‚ฐ์˜ ํŠน์ง•์—์„œ ๊ธฐ์ธํ•œ๋‹ค.

 

#1-6

 

#1-7

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด๋ ‡๊ฒŒ ๊ฐ„์†Œํ™” ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.โ€จwhile๋ฌธ์ด ์ง„ํ–‰๋จ์— ๋”ฐ๋ผ, binarySearchFirstIndex()์˜ max ๋˜๋Š” binarySearchLastIndex()์˜ min์ด ๊ฐ๊ฐ ifirst์™€ ilast์— ๊ฐ™์•„์งˆ ๋•Œ๊นŒ์ง€ ์ ‘๊ทผํ•˜๋Š” ๊ฒฝํ–ฅ์„ฑ์ด ๊ฐ„์†Œํ™” ์ „๊ณผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฌผ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ(๊ณ„์‚ฐ ์†๋ ฅ)์€ ๋ฏธ์„ธ๋จผ์ง€๋งŒํผ์ด๋ผ๋„ ๋–จ์–ด์งˆ ๊ฒƒ์ด๋‹ค.

 

#2 ์ฝ”๋“œ

#2-1 ์ž๋ฐ”

public static int binarySearchFirstIndex(int[] values, int x) {
    int min = 0;
    int max = values.length - 1;
            
    while (min < max) {
        int mid = (min + max) / 2;
        
        // up
        if (values[mid] < x) {
            min = mid + 1;
        
        // equal
        } else if (values[mid] == x) {
            max = mid;
        
        // down
        } else { // values[mid] > x
            max = mid - 1;
        }
    }
        
    if(values[min] == x) {
        return min;
    } else {
        return -1;
    }
}

public static int binarySearchLastIndex(int[] values, int x) {
    int min = 0;
    int max = values.length - 1;
            
    while (min < max) {
        int mid = (min + max) / 2;
        
        // up
        if (values[mid] < x) {
            min = mid + 1;
        
        // equal
        } else if (values[mid] == x) {
            min = mid;
        
        // down
        } else { // values[mid] > x
            max = mid - 1;
        }
    }
    
    if(values[max] == x) {
        return max;
    } else {
        return -1;
    }
}

 

#2-2 ์ฝ”ํ‹€๋ฆฐ

fun binarySearchFirstIndex(values : Array<Int>, x : Int) : Int {
    var min = 0
    var max = values.size - 1

    while(min < max) {
        val mid = (min + max) / 2

        // up
        if(values[mid] < x) {
            min = mid + 1

        // equal
        } else if(values[mid] == x) {
            max = mid

        // down
        } else { // values[mid] > x
            max = mid - 1
        }
    }

    if(values[min] == x) {
        return min
    } else {
        return -1
    }
}

fun binarySearchLastIndex(values : Array<Int>, x : Int) : Int {
    var min = 0
    var max = values.size - 1

    while(min < max) {
        val mid = (min + max) / 2 + 1

        // up
        if(values[mid] < x) {
            min = mid + 1

        // equal
        } else if(values[mid] == x) {
            min = mid

        // down
        } else { // values[mid] > x
            max = mid - 1
        }
    }

    if(values[max] == x) {
        return max
    } else {
        return -1
    }
}

 

#3 ์š”์•ฝ

์ค‘๋ณต๋œ ์›์†Œ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ด์ง„ ํƒ์ƒ‰์€, ๊ฐ™์€ ๊ฐ’์„ ๊ณต์œ ํ•˜๋Š” ์ธ๋ฑ์Šค๋“ค ์ค‘์—์„œ ์ฒซ๋ฒˆ์งธ ์ธ๋ฑ์Šค ๋˜๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ์ ์ง„์ ์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.

 

#4 ์ด ๊ฐœ๋…์ด ์‚ฌ์šฉ๋œ ๊ธ€

 

[๋ฐฑ์ค€] 1654 (๋žœ์„  ์ž๋ฅด๊ธฐ)

#1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ #1-1 #1-2 ์ค‘๋ณต๋œ ์›์†Œ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ด์ง„ ํƒ์ƒ‰ (Binary Search) #1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์ง„ ํƒ์ƒ‰ (Binary search) #1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ ‡๊ฒŒ ํ•ด์„œ x์˜ ์ธ๋ฑ์Šค i๋ฅผ ์ฐพ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ์ด x๊ฐ€ ๋ฐฐ์—ด values ์–ด๋””์—๋„

kenel.tistory.com

 

[๋ฐฑ์ค€] 2805 (๋‚˜๋ฌด ์ž๋ฅด๊ธฐ)

#1 ๊ฐœ์š”#1-1 ๋ฌธ์ œ ์ดํ•ด'๋‚˜๋ฌด๋ฅผ ์ž๋ฅด๋Š” ๋†’์ด(cuttingHeight)'๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ๋ฌป๋Š” ๋ฌธ์ œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  cuttingHeight์˜ ๋ฒ”์œ„๋Š” 0 ~ 1,000,000,000์ด๋‹ค. ๋”ฐ๋ผ์„œ, cuttingHeight๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œ์ผœ์„œ ์ผ์ผํžˆ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์‹œ

kenel.tistory.com