[LeetCode | Javascript] Find Minimum in Rotated Sorted Array

박기영·2023년 9월 2일

LeetCode

목록 보기
27/41

solution

/**
 * @param {number[]} nums
 * @return {number}
 */
var findMin = function(nums) {
    // 아까랑 똑같은데 이번엔 target이 없음
    // 또한, 이 문제는 전체 배열에서 최솟값을 찾고 싶기 때문에
    // 이전 문제처럼 안 보는 부분이 생기면 안됨.
    // 정 안보고 싶으면 조건을 확실히 처리해서, 확실히 얘는 최소값이 없다는걸 명확하게 하고 넘어가야함.

    let start = 0;
    let end = nums.length - 1;
    let middle = Math.floor((start + end) / 2);

    while(start <= end){
        // start보다 middle이 큰 경우,
        // start와 end를 비교한다.
        // 만약 start가 더 작다면,
        // 오름차순 정렬이기 때문에 start값 반환
        // 그렇지 않고 end가 더 작다면,
        // 최소값은 middle 뒤에 있으므로,
        // start = middle + 1
        if(nums[start] <= nums[middle]){
            if(nums[start] <= nums[end]){
                return nums[start];
            } else {
                start = middle + 1;
            }
        } else {
            // start보다 middle이 작은 경우,
            // 최솟값은 start와 middle 사이에 있다.
            end = middle;
        }

        middle = Math.floor((start + end) / 2);
    }

    return nums[start];
};

정렬되지 않은 배열에 대한 binary search는 항상 큰 틀은 같다.
조건에 따라 세부 조건이 변경되는 정도인데, 이번 문제도 그런 식으로 해결되었다.

주어진 배열 내에서 최소값을 찾는 것이 목표였기 때문에,
target을 정해놓고 움직이는 binary search가 아닌 다른 방법을 사용해야했다.

우선 middle을 기준으로 양 옆을 살펴봐서 정렬된 배열이 있는 쪽을 찾는다.

1)
nums[start]nums[middle]보다 작은 경우, middle 기준 왼쪽 배열은 오름차순 정렬이므로,
이 중 가장 작은 값인 nums[start]nums[end]를 비교한다.

[2,3,4,5,1]인 경우 nums[start]는 배열 전체에서 최소값이 아니지만,
[1,2,3,4,5]인 경우 nums[start]가 배열 전체에서 최소값이 된다는 점을 활용하여 연산한다.
만약 nums[start]nums[end]보다 작다면 그대로 nums[start]를 반환하고,
그렇지 않으면 최소값은 middle 뒤에 있으므로 start를 끌어올려준다.

2)
nums[start]nums[middle]보다 크다면,
이는 분명히 startmiddle 사이에 최솟값이 존재한다는 것이다.
따라서 endmiddle로 설정하고 다시 연산을 진행한다.

다른 분들도 같은 로직을 사용하셨기 때문에 코드가 상당히 유사했다.
이번에는 접근을 잘 한 것 같아서 뿌듯하다..ㅎㅎ..

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

0개의 댓글