관리 메뉴

FU11M00N

[LeetCode] Search Insert Position - Javascript 본문

알고리즘

[LeetCode] Search Insert Position - Javascript

호IT 2023. 8. 29. 01:57

Search Insert Position

[주어진 값 찾거나, 순서에 맞게 인덱스 리턴하기]

 

제약 조건 

1 <= nums.length <= 10^4
-10^4 <= nums[i] <= 10^4
nums contains distinct values sorted in ascending order.
-10^4 <= target <= 10^4

 

Example

ex1) Input: nums = [1,3,5,6], target = 5
     Output: 2

ex2) Input: nums = [1,3,5,6], target = 2
     Output: 1

ex3) Input: nums = [1,3,5,6], target = 7
     Output: 4

초기 문제 접근 방식

O(log n)으로 반드시 문제를 풀어야 한다고 기재되어 있기에,
이진탐색 방식을 생각했다.

 

이진탐색은 left, mid, right 변수를 생성해
left는 맨 처음 인덱스, mid는 중간 인덱스, right는 맨 마지막 인덱스로 초기화하고
while 문을 left가 right보다 크거나 같을 때까지 순회한다.

 

mid는 left와 right를 더해 2로 나눈 몫 값으로 초기화하고
nums[mid] 값이 target과 같다면 mid의 값을 리턴한다.
target이 더 크다면 left = mid +1으로 업데이트한다.
taget이 더 작으면 right = right -1으로 업데이트한다.
또한 target 값이 배열 인덱스에 없을 수도 있기에 이 땐 left를 리턴한다.

solve 전체 코드

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
    let left = 0;
    let right = nums.length-1;

    while(left <= right){
        let mid = Math.floor((left+right) / 2);

        if(nums[mid] === target){
            return mid
        }else if(nums[mid] < target){
            left = mid+1;
        }else if(nums[mid] > target){
            right = mid-1
        }
    }
    return left
};

 

다른 solve 코드

var searchInsert = function (nums, target) {
  let left = 0;
  let right = nums.length - 1;
  let middle = Math.floor((left + right) / 2);
  while (nums[middle] !== target && left <= right) {
    if (target < nums[middle]) { // target이 작으면 right를 줄인다.
      right = middle - 1;
    } else { // target이 더크면 left를 늘린다. 
      left = middle + 1;
    }
    middle = Math.floor((left + right) / 2);
  }
  // 같아서 while문이 끝난거면 middle, 달라서 마지막에 끝난거면 left의 값을 return한다.
  return nums[middle] === target ? middle : left;
};

해당 코드 또한 비슷한 방식으로 풀이됐다.
nums[middle]이 target보다 크면 right를 하나씩 줄이고
right에는 middle-1으로 업데이트하고
nums[middle]이 더 작다면 left를 middle+1로 업데이트한다.
같아서 while 문이 종료된 거라면 middle을 리턴하고, 달라서 마지막에 끝난 거라면 left의 값을 리턴한다.

Comments