๋ฌธ์ ํด๊ฒฐ ๊ณผ์
โ๏ธ ๋๋ง์ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ์ ๋ฆฌํ๊ธฐ (=์ฒด๊ณํ)
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๋ ๋ฐฐ์ด์ ์ ์ฉํ๊ธฐ๋ ์๊ฐ๋ณด๋ค ๊น๋ค๋ก์ ๋ค.
์์ผ๋ก ์์๋ฅผ ์ง์ ๋ง๋ค์ด๊ฐ๋ฉฐ ๋ก์ง์ ์ง๋ ๊ฒ์ด ๋์์ด ๋์๋ค.
'๐ซ ETC > Leetcode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Week 3-1. [Binary Search Tree (BST)] 530. Minimum Absolute Difference in BST (Python3) (0) | 2023.09.08 |
---|---|
Week 2-2. [Binary Search] 153. Find Minimum in Rotated Sorted Array (Python3) (0) | 2023.09.05 |
Week 2-2. [Divide & Conquer] 148. Sort List (Python3) (0) | 2023.09.04 |
Week 2-1. [Hash Table] 242. Valid Anagram (Python3) (0) | 2023.09.01 |
Week 2-1. [Hash Table] 383. Ransom Note (Python3) (0) | 2023.09.01 |