본문 바로가기
Algorithm

[Algorithm] LowerBound & UpperBound

by thoonk: 2021. 4. 29.

다른 사람의 풀이를 확인하다가 몰랐던 새로운 알고리즘 발견했다. 

Lower Bound는 찾고자 하는 값 이상이 처음 나오는 인덱스를 찾는 것이다. 

Upper Bound는 찾고자 하는 값보다 큰 (초과) 값이 처음 나오는 인덱스를 찾는 것이다. 

두 알고리즘 모두 이분탐색을 활용한다. 

 

func lowerBound(arr: [Int], start: Int, end: Int, target: Int) -> Int {
    var start = start
    var end = end
    
    while start < end {
        let mid = (start + end) / 2
        // target 값보다 작을 때 start를 움직여 target보다 크거나 같은 첫번째 값의 인덱스를 찾는다.
        if arr[mid] < target {
            start = mid + 1
        } else {
            end = mid
        }
    }
    return end
}

func upperBound(arr: [Int], start: Int, end: Int, target: Int) -> Int {
    var start = start
    var end = end
    
    while start < end {
        let mid = (start + end) / 2
        // target 값보다 작거나 같을 때 start를 움직여 target보다 큰 첫번째 값의 인덱스를 찾는다.
        if arr[mid] <= target {
            start = mid + 1
        } else {
            end = mid
        }
    }
    return end
}


var nums = [1,2,3,4,6,7]
var target = 2

print(lowerBounds(arr: nums, start: 0, end: nums.count-1, target: target)) // 1 
print(upperBounds(arr: nums, start: 0, end: nums.count-1, target: target)) // 2

코드에서는 등호 하나의 차이이다. 

'Algorithm' 카테고리의 다른 글

[Algorithm] Queue 구현 Swift  (0) 2021.05.13
[Algorithm] DFS/BFS  (0) 2020.12.01
[Swift] PS 시간 측정하기  (0) 2020.11.20

댓글