๐Ÿ’ซ ETC/Leetcode

Week 2-2. [Binary Search] 33. Search in Rotated Sorted Array (Python3)

ming412 2023. 9. 5. 08:53

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

โœ๏ธ ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ ์ •๋ฆฌํ•˜๊ธฐ (=์ฒด๊ณ„ํ™”)

https://leetcode.com/problems/search-in-rotated-sorted-array/?envType=study-plan-v2&envId=top-interview-150 

 

Search in Rotated Sorted Array - LeetCode

Can you solve this real interview question? Search in Rotated Sorted Array - There is an integer array nums sorted in ascending order (with distinct values). Prior to being passed to your function, nums is possibly rotated at an unknown pivot index k (1 <=

leetcode.com

์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ด rotate ๋œ ์ƒํƒœ๋กœ ์ฃผ์–ด์ง„๋‹ค. O(log n)์˜ ์‹œ๊ฐ„์•ˆ์— ํŠน์ • ๊ฐ’์„ ํƒ์ƒ‰ํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ.
  • nums์˜ ๊ธธ์ด๋Š” [1, 5000]์ด๋‹ค.
  • ๋ฐฐ์—ด ์•ˆ์— target์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ O(log n)์•ˆ์— ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ”Ž ์–ด๋–ค ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ๋Š”๊ฐ€?

mid๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ˜์„ ๋‚˜๋ˆด์„ ๋•Œ, ๋ฐ˜๋“œ์‹œ ํ•œ ์ชฝ์€ ์ •๋ ฌ๋œ ์ƒํƒœ์ผ ๊ฒƒ์ด๋‹ค.

 

์ •๋ ฌ๋œ ์ƒํƒœ๋Š” ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ?

nums[lp] <= nums[mid]๋ผ๋ฉด ์™ผ์ชฝ ๋ถ€๋ถ„์ด ์ •๋ ฌ๋œ ์ƒํƒœ์ธ ๊ฒƒ์ด๊ณ , ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์ด ์ •๋ ฌ๋œ ์ƒํƒœ์ธ ๊ฒƒ์ด๋‹ค.

 

๋งŒ์•ฝ ์™ผ์ชฝ์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด,

nums[lp] <= target < nums[mid]๋กœ target์ด ์™ผ์ชฝ์— ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ณ ,

target์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด target์€ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

ํ˜น์€ ์˜ค๋ฅธ์ชฝ์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด,

nums[mid] < target <= nums[rp]๋กœ target์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ณ ,

target์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด target์€ ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณตํ•˜๋‹ค๋ณด๋ฉด target์„ ์ฐพ๊ฑฐ๋‚˜ ํ˜น์€ -1์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

 

๐Ÿ™ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ: ์ž…๋ ฅ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ

O(log n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„์— ํ•ด๊ฒฐํ•˜๋ผ๋Š” ์กฐ๊ฑด์ด ์ฃผ์–ด์กŒ์œผ๋ฏ€๋กœ binary search๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

๐Ÿ“ ์˜์‚ฌ ์ฝ”๋“œ

lp, rp = 0, len(nums)-1

lp๊ฐ€ rp๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋™์•ˆ:
	mid = (lp+rp)//2
    if nums[mid]๊ฐ€ target๊ณผ ๊ฐ™๋‹ค๋ฉด: return mid
    elif ์™ผ์ชฝ ๋ถ€๋ถ„์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด:
    	if target์ด ์™ผ์ชฝ์— ์žˆ๋‹ค๋ฉด: rp = mid-1
        else: lp = mid+1
    else ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด:
    	if target์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋‹ค๋ฉด: lp = mid+1
        else: rp = mid-1
    return -1

 

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

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

        while lp <= rp:
            mid = (lp+rp) // 2
            if nums[mid] == target: return mid
            elif nums[lp] <= nums[mid]: # ์™ผ์ชฝ ์ •๋ ฌO && ์˜ค๋ฅธ์ชฝ ์ •๋ ฌX
                if nums[lp] <= target < nums[mid]: # target์ด ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฒฝ์šฐ
                    rp = mid-1
                else: # target์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๊ฒฝ์šฐ
                    lp = mid+1
            else: # ์™ผ์ชฝ ์ •๋ ฌX && ์˜ค๋ฅธ์ชฝ ์ •๋ ฌO
                if nums[mid] < target <= nums[rp]: # target์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๊ฒฝ์šฐ
                    lp = mid+1
                else: # target์ด ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฒฝ์šฐ
                    rp = mid-1
        return -1

 

๋‚ด ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

binary search๋ฅผ ์ด์šฉํ•˜์—ฌ ์ ˆ๋ฐ˜์”ฉ ๋Œ€์ƒ์„ ์ค„์—ฌ๋‚˜๊ฐ”์œผ๋ฏ€๋กœ O(log n)์ด๋‹ค.

 

โœ๏ธ ์„ฑ๋Šฅ ํšŒ๊ณ 

1์ดˆ ์ œํ•œ์—์„œ O(log n)์˜ ์ตœ๋Œ€ ์ž…๋ ฅ์€ 10^7~10^8์ด๋‹ค. ๋ฌธ์ œ์—์„œ๋Š” ์ตœ๋Œ€ ์ž…๋ ฅ์ด 5000์ด๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ข‹์€ ํŽธ์ด๋‹ค.

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

์ถœ์ œ์ž์˜ ์˜๋„๋Š” ์•„๋‹ˆ๊ฒ ์ง€๋งŒ ํŒŒ์ด์ฌ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€ ์ˆ˜๋„ ์žˆ๋‹ค.

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        try:
            return nums.index(target)
        except:
            return -1

 

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

list.index()์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์œผ๋กœ ์ด์ง„ ํƒ์ƒ‰๋ณด๋‹ค ๋А๋ฆฌ๋‹ค.

 

๋А๋‚€ ์ 

binary search์˜ ๊ฐœ๋…์€ ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ rotate๋œ ๋ฐฐ์—ด์— ์ ์šฉํ•˜๊ธฐ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๊นŒ๋‹ค๋กœ์› ๋‹ค.

์†์œผ๋กœ ์˜ˆ์‹œ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด๊ฐ€๋ฉฐ ๋กœ์ง์„ ์งœ๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค.