반응형
이진탐색 중 Lower Bound와 Upper Bound가 있다. 정렬된 배열에서 같은 값이 여러개인 경우 해당 알고리즘을 사용한다.
- Lower: 같은 값들 중 가장 왼쪽에 있는 인덱스 리턴
- Upper: 같은 값들 중 가장 오른쪽에 있는 값 한칸 옆에 있는 값 리턴 -> 1,2,3,3,3,4배열에서 target = 3인경우 4가 있는 위치 리턴
function lower_bound(arr, target)
set left = 0 // 첫 번째 원소의 위치로 설정합니다.
set right = arr.size - 1 // 마지막 원소의 위치로 설정합니다.
set min_idx = arr.size // 최소이므로, 답이 될 수 있는 값보다 더 큰 값으로 설정합니다.
while left <= right // [left, right]가 유효한 구간이면 계속 수행합니다.
set mid = (left + right) / 2 // 가운데 위치를 선택합니다.
if arr[mid] >= target // 만약에 선택한 원소가 target보다 같거나 크다면
right = mid - 1 // 왼쪽에 조건을 만족하는 숫자가 더 있을 가능성 때문에 right를 바꿔줍니다.
min_idx = min(min_idx, mid) // 같거나 큰 값들의 위치 중 최솟값을 계속 갱신해줍니다.
else
left = mid + 1 // 작은 경우라면 left를 바꿔줍니다.
return min_idx // 조건을 만족하는 최소 index 값을 반환합니다.
lower의 경우 target이 arr[mid]보다 같거나 크다면 min_idx에 최솟값을 넣는다. 같거나 클 때 min을 초기화하는 이유는 같은 값을 가진 값 중 가장 작은 값을 찾아야하기 때문이다.
즉 값을 찾았을 때 값이 초기화 돼야한다.이와 반대로 Upper의 경우 같은 값을 찾는게 아니라 타겟 값 +1인 값을 찾기 때문에 같거나 큰 값이 아닌 큰 값만 찾는다.
function upper_bound(arr, target)
set left = 0 // 첫 번째 원소의 위치로 설정합니다.
set right = arr.size - 1 // 마지막 원소의 위치로 설정합니다.
set min_idx = arr.size // 최소이므로, 답이 될 수 있는 값보다 더 큰 값으로 설정합니다.
while left <= right // [left, right]가 유효한 구간이면 계속 수행합니다.
set mid = (left + right) / 2 // 가운데 위치를 선택합니다.
if arr[mid] > target // 만약에 선택한 원소가 target보다 크다면
right = mid - 1 // 왼쪽에 조건을 만족하는 숫자가 더 있을 가능성 때문에 right를 바꿔줍니다.
min_idx = min(min_idx, mid) // 큰 값들의 위치 중 최솟값을 계속 갱신해줍니다.
else
left = mid + 1 // 같거나 작은 경우라면 left를 바꿔줍니다.
return min_idx // 조건을 만족하는 최소 index 값을 반환합니다.
반응형
'알고리즘' 카테고리의 다른 글
[코드트리 조별과제] 시간복잡도 (0) | 2024.07.27 |
---|---|
[JAVA 자바] 프로그래머스 PCCP 모의고사 3번 유전법칙 (0) | 2023.06.09 |
[JAVA 자바] 프로그래머스 과제 진행하기 (2) | 2023.06.09 |
[JAVA 자바] 백준 2179 (0) | 2023.05.25 |
[프로그래머스] 혼자 놀기의 달인 자바 (0) | 2022.10.13 |