Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 보안뉴스한줄요약
- 카카오프로젝트
- 깃허브
- 오라클
- 자바스크립트 jQuery
- 보안뉴스
- php
- 자바스크립트 기본 문법
- 자바스크립트 element api
- ES6
- javascript
- GIT
- 카카오프로젝트 100
- 자바스크립트 prototype
- oracle db
- 보안뉴스 한줄요약
- 자바스크립트
- Oracle SQL
- python
- 자바스크립트 API
- 자바스크립트 객체
- 파이썬
- 보안뉴스요약
- 카카오프로젝트100
- 자바스크립트 node
- 다크웹
- oracle
- 보안뉴스 요약
- numpy
- 랜섬웨어
Archives
- Today
- Total
FU11M00N
[LeetCode] Search Insert Position - Javascript 본문
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의 값을 리턴한다.
'알고리즘' 카테고리의 다른 글
[LeetCode] Min Stack - Javascript (0) | 2023.08.30 |
---|---|
[LeetCode] Search a 2D Matrix - Javascript (0) | 2023.08.29 |
[LeetCode] Add Two Numbers - Javascript (2) | 2023.08.28 |
[LeetCode] Merge Two Sorted Lists - Javascript (0) | 2023.08.28 |
[LeetCode] Linked List Cycle - Javascript (0) | 2023.08.28 |
Comments