[LeetCode | Javascript] Search Insert Position

박기영·2023년 8월 28일

LeetCode

목록 보기
20/41

solution

/**
 * @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를 기준으로
targetmid보다 크면 leftmid 뒤로 옮겨주고,
targetmid보다 작으면 rightmid 앞으로 옮겨주면 범위를 좁혀가는 것이다.

보통의 경우는 굉장히 쉽게 구할 수 있는데, 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

targetnums의 그 어떤 값보다 작을 수도, 사이에 있을 수도, 더 클 수도 있기 때문에
예외 상황에 대해서 케이스를 작성해보는 것이 도움이 되었다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글