어떤 값 x가 해가 될 수 있는지를 확인할 수는 있다면, 이분 탐색으로 가능한 값의 범위를 줄여가며 최적 해를 찾아낼 수 있다
특정 값 가정
가능하면 → 더 좋은 값으로 이동
불가능하면 → 가능한 값으로 이동
값 찾기
int binary_search(int[] nums, int target){ int left = 0; int right = nums.length - 1; while (left <= right){ int mid = left + (right - left) / 2; if (nums[mid] == target){ return mid; } else if (nums[mid] < target){ left = mid + 1; } else if (nums[mid] > target){ right = mid - 1; } } return -1; }
왼쪽 가장자리 값 찾기
int left_bound(int[] nums, int target){ int left = 0; int right = nums.length - 1; while (left <= right){ int mid = left + (right - left) / 2; if (nums[mid] == target){ // 반환 안하고 오른쪽 가장자리를 축소하여 왼쪽 가장자리 확정 right = mid - 1; } else if (nums[mid] < target){ left = mid + 1; } else if (nums[mid] > target){ right = mid - 1; } } // left 경계확인 if (left > nums.length || nums[left] != target) return -1; return left; }
오른쪽 가장자리 값 찾기
int right_bound(int[] nums, int target){ int left = 0; int right = nums.length - 1; while (left <= right){ int mid = left + (right - left) / 2; if (nums[mid] == target){ // 반환 안하고 왼쪽 가장자리를 축소하여 오른쪽 가장자리 확정 left = mid + 1; } else if (nums[mid] < target){ left = mid + 1; } else if (nums[mid] > target){ right = mid - 1; } } // right 경계확인 if (right < 0 || nums[right] != target) return -1; return right; }