/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
// target이 있으면 그 인덱스를
// 없으면 들어가야할 인덱스를 반환
let left = 0;
let right = nums.length - 1;
while(left <= right){
// left와 (right-left)를 2로 나눈 값을 더하면
// 현재 left, right의 중간 지점이 나온다.
// let mid = left + (right - left) / 2;
let mid = left + Math.floor((right - left) / 2);
if(target === nums[mid]){
return mid;
}
if(target > nums[mid]){
left = mid + 1;
continue;
}
if(target < nums[mid]){
right = mid - 1;
continue;
}
}
return left;
};
대표적인 binary search 문제였다.
두 개의 포인터를 두고, 그 중앙인 mid를 기준으로
target이 mid보다 크면 left를 mid 뒤로 옮겨주고,
target이 mid보다 작으면 right를 mid 앞으로 옮겨주면 범위를 좁혀가는 것이다.
보통의 경우는 굉장히 쉽게 구할 수 있는데, target이 없는 경우에 대한 처리가 이해가 잘 되지 않는다.
몇 가지 예시를 통해서 탐색 과정을 살펴보자.
case 1)
nums = [1,3,5,6], target = 2
try 1) left 0, right 3 ==> mid 1 ==> target < nums[mid] ==> right = mid - 1 = 0
try 2) left 0, right 0 ==> mid 0 ==> target > nums[mid] ==> left = mid + 1 = 1
while 종료
target이 위치할 수 있는 곳 = left = 1
case 2)
nums = [1,3,5,6], target = 0
try 1) left 0, right 3 ==> mid 1 ==> target < nums[mid] ==> right = mid - 1 = 0
try 2) left 0, right 0 ==> mid 0 ==> target < nums[mid] ==> right = mid - 1 = -1
while 종료
target이 위치할 수 있는 곳 = left = 0
target이 nums의 그 어떤 값보다 작을 수도, 사이에 있을 수도, 더 클 수도 있기 때문에
예외 상황에 대해서 케이스를 작성해보는 것이 도움이 되었다.