[NeetCode/Python] Find Target in Rotated Sorted Array

2024. 8. 8. 01:35·Algorithm/NeetCode

문제 링크: https://neetcode.io/problems/find-target-in-rotated-sorted-array

 

NeetCode

 

neetcode.io

 

굉장히 특이한 문제였다.

O(n)으로 하면 풀기 쉽지만 O(log n)의 시간 복잡도로 문제를 풀라고 되어있다.

딱 보자마자 binary search가 떠올랐는데 문제는 문제 조건이다. binary search는 알다시피 정렬된 배열에서 사용하는 sort 알고리즘이다.

하지만 이 문제는 기존 정렬 배열에서 특정 횟수만큼 rotate된 배열을 input으로 두었다.

binary search를 활용하여 푸는 문제들은 봤어도 이렇게 응용한 문제는 처음봐서 굉장히 신선했다.


- 풀이 찾아 해매기

1. 

처음에는 기존 sorted array에서 rotate가 된거니 rotate된 횟수를 알면 binary search를 사용할 수 있겠다고 생각했다.

왜냐하면 rotate된 횟수로 기존 array 의 index를 이용하여 binary seach 알고리즘을 그대로 적용할 수 있기 때문이다.

result = (original index + rotate times) % 6	# rotate 된 index
reserse = (length - rotate times) % 6	# rotate 되기 전 index(?)를 구하려고 했던듯

 

그런데 이 문제의 똑똑한 점은 rotate 횟수를 알려주지 않는다는 점이다!!

 

2.

고민하다가 솔직히 풀이과정 동영상을 앞부분만 봤다. (멩세코 전체를 보지 않았다! 힌트만 얻으려고 했음)

 

동영상에서 아주 신박하게 이 배열을 차트로 그려낸걸보고 바로 유레카를 외치며 동영상을 다 보지 않았다!

와.. 이렇게 간단하고 보기 쉽게 이 문제를 그림으로 그려내다니 다시 한번 너무 놀라웠다.

 

저렇게 그래프를 그리면 이 문제의 케이스들을 분류할 수 있게 된다.

총 4가지가 있다.

(이 케이스들은 아이패드로 그려서 나중에 첨부하겠다)

 

케이스별로 구분이 되어야 binary seach 알고리즘을 활용할 수 있다.

그렇다면 이 케이스들을 어떻게 구분할 수 있을까? 우리가 알고 있는 값은 mid와 left, right 값, 그리고 target 값이다.

이 정보들로 충분히 케이스들을 구분할 수 있고 그 코드는 아래와 같다.

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left = 0
        right = len(nums) - 1

        while (left <= right):
            mid = (left + right) // 2

            if nums[mid] == target:
                return mid

            if nums[left] <= nums[mid]:
                if target > nums[mid] or target < nums[left]:
                    left = mid + 1
                else:
                    right = mid - 1
            else: # nums[left] > nums[mid]
                if target < nums[mid] or target > nums[right]:
                    right = mid - 1
                else:
                    left = mid + 1

        return -1

 

정말 많은걸 배운 문제였다.

 

시간 복잡도

배열 길이 : N

=> O(log N)

 

'Algorithm > NeetCode' 카테고리의 다른 글

[NeetCode/Python] Min Cost Climbing Stairs  (0) 2024.09.19
[NeetCode/Python] Kth Largest Integer in a Stream  (0) 2024.09.03
[NeetCode/Python] Two Integer Sum  (0) 2024.08.31
[NeetCode/Python] Plus One  (0) 2024.08.30
[NeetCode/Python] Climbing Stairs  (0) 2024.08.17
'Algorithm/NeetCode' 카테고리의 다른 글
  • [NeetCode/Python] Kth Largest Integer in a Stream
  • [NeetCode/Python] Two Integer Sum
  • [NeetCode/Python] Plus One
  • [NeetCode/Python] Climbing Stairs
빵빵0
빵빵0
(아직은) 공부하고 정리하는 블로그입니다.
  • 빵빵0
    Hack Your World
    빵빵0
  • 전체
    오늘
    어제
    • 분류 전체보기 (92)
      • Error Handling (7)
      • Project (5)
        • MEV (2)
      • Architecture (0)
        • API (0)
        • Cache (0)
        • 사소한 고민거리 (0)
      • Computer Science (4)
        • Data Structure (2)
        • Database (1)
        • Cloud (0)
        • OS (0)
        • Infra, Network (1)
        • AI (0)
      • Language (8)
        • Go (8)
        • Rust (0)
        • Python (0)
        • Java (0)
      • Algorithm (40)
        • BaekJoon (18)
        • Programmers (7)
        • LeetCode (6)
        • NeetCode (9)
      • SW Books (9)
        • gRPC Up & Running (1)
        • System Design Interview (2)
        • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (6)
        • 블록체인 해설서 (0)
        • 후니의 쉽게 쓴 CISCO 네트워킹 (0)
      • BlockChain (4)
        • Issues (0)
        • Research (4)
        • Tech (0)
      • Own (8)
        • TIR(Today I Read) (3)
        • Personal (2)
        • Novel (0)
        • Memo (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    goroutine
    Hash Table
    LeetCode
    MongoDB
    Greedy
    BFS
    DP
    Palindrome
    프로그래머스
    Programmers
    context
    KBW
    백준
    BEAKJOON
    go
    블록체인
    EVM
    큐
    2024
    two pointer
    ethereum
    NeetCode
    Python
    golang
    chart
    MEV
    blockchain
    candlechart
    스택
    BaekJoon
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
빵빵0
[NeetCode/Python] Find Target in Rotated Sorted Array
상단으로

티스토리툴바