본문 바로가기

알고리즘/이진탐색

이진탐색 LowerBound, UpperBound 이해하기 - Swift

정의

  • 이진 탐색 : 정렬 되어 있는 배열에서 특정 요소를 찾을 때 사용할 수 있는 알고리즘
  • LowerBound :  정렬 되어 있는 배열에서 그 요소가 시작되는 첫번째 인덱스 (중복값 들어있을 때 사용 가능)
  • UpperBound : 정렬 되어 있는 배열에서 그 요소가 끝나는 다음 인덱스 (중복값 들어있을 때 사용 가능)

정의는 이러한데 읽고 코드를 봐도 머릿속에서 그림이 안그려지더라구요. 그래서 그림을 그려보면서 이해해보겠습니다.

 

문제 상황

[1, 2, 3, 3, 4, 5] 에서 3을 찾을 때 

LowerBound = 처음으로 3이 나오는 인덱스 

UpperBound = 마지막 3의 다음 인덱스 

 

LowerBound 

코드

func lowerBound(_ element: Int, in arr: [Int]) -> Int {
    var start = 0
    var end = arr.count
    
    while start < end {
        let mid = (start+end) / 2
        let val = arr[mid]
        
        if val < element {
            start = mid + 1
        } else {
            end = mid
        }
    }
    
    return end
}

 

UpperBound

코드

func upperBound(_ element: Int, in arr: [Int]) -> Int {
    var start = 0
    var end = arr.count
    
    while start < end {
        let mid = (start+end) / 2
        let val = arr[mid]
        
        if val <= element {
            start = mid + 1
        } else {
            end = mid
        }
    }
    
    return end
}
반응형

'알고리즘 > 이진탐색' 카테고리의 다른 글

백준 2805 나무 자르기 - Swift  (0) 2022.02.21
백준 1654 랜선 자르기 - Swift  (0) 2022.02.20
백준 10816 숫자 카드2 - Swift  (0) 2022.02.19
백준 1920 수찾기 - Swift  (0) 2022.02.19