Skip to content

[Leetcode] 33. Search in Rotated Sorted Array ​

Problem ​

문제 링크

숫자둜 μ£Όμ›Œμ§„ λ°°μ—΄μ—μ„œ νƒ€κ²Ÿκ°’μ˜ 인덱슀λ₯Ό μ°ΎλŠ” 문제. O(logn) (배열이 μ •λ ¬λœ μƒνƒœμ—μ„œ νšŒμ „λ˜μ–΄μžˆμŒ)

Solution ​

O(logn) 으둜 ν’€κΈ°μœ„ν•΄μ„œ 이진탐색을 μ΄μš©ν•¨.

  1. νšŒμ „μ˜ 유무λ₯Ό νŒŒμ•…ν•˜κ³  μžˆλ‹€λ©΄ νšŒμ „ν•˜λŠ” 인덱슀λ₯Ό μ°Ύμ•„λ‚Έλ‹€.
  2. νšŒμ „ν•˜λŠ” 인덱슀λ₯Ό μ°Ύλ‹€κ°€ νƒ€κ²Ÿκ°’μ΄ μš΄μ’‹κ²Œ λ‚˜μ˜€λ©΄ λ°”λ‘œ ν•΄λ‹Ή 값을 리턴
  3. νšŒμ „ν•˜λŠ” 인덱슀λ₯Ό μ°ΎλŠ” 방법
    • mid의 값이 left의 값보닀 크닀면 μ˜€λ¦„μ°¨μˆœμΈ 정상적인 배열이고, μ•„λ‹ˆλΌλ©΄ κ·Έ 뢀뢄은 νšŒμ „μ΄ μΌμ–΄λ‚œ 뢀뢄이닀. 이 쑰건을 μ΄μš©ν•΄μ„œ νšŒμ „ν•˜λŠ” λΆ€λΆ„μ˜ μ˜μ—­μ„ μ’ν˜€κ°„λ‹€.
  4. νšŒμ „ν•˜λŠ” 뢀뢄이 μžˆμ„λ•Œ, νƒ€κ²Ÿμ΄ μ–΄λŠ λ²”μœ„μ— μžˆλŠ”μ§€ ν™•μΈν•˜κ³  ν•΄λ‹Ήν•˜λŠ” λ²”μœ„μ•ˆμ—μ„œ 이진탐색을톡해 νƒ€κ²Ÿκ°’μ„ μ°Ύμ•„λ‚Έλ‹€.

JS Code ​

javascript
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    function bsPosition () {
        let left = 0, right = nums.length
        
        while(left < right) {
            const mid = Math.floor((left + right) / 2)
            
            if (nums[mid] === target) return mid // νšŒμ „μ„ 찾기전에 μš΄μ’‹κ²Œ νƒ€κ²Ÿμ„ λ°œκ²¬ν•  경우
            
            if (nums[left] < nums[mid]) left = mid
            else right = mid
        }
        
        return left + 1
    }
    
    const rotatedIdx = bsPosition()
    const isRotated = () => rotatedIdx !== nums.length
    
    function bsFindTarget (pLeft, pRight) {
        let left = pLeft, right = pRight
        
        while(left < right) {
            const mid = Math.floor((left + right) / 2)
            if (nums[mid] < target) left = mid + 1
            else right = mid
        }
        
        return target === nums[left] ? left : -1
    }
    
    if (isRotated()) {
        return nums[0] <= target ? bsFindTarget(0, rotatedIdx) : bsFindTarget(rotatedIdx, nums.length)
    } else {
        return bsFindTarget(0,nums.length)
    }
};