|
| 1 | +# import bisect |
| 2 | +from typing import List |
| 3 | +class Solution(): |
| 4 | + def _my_bisect_left(self, a: List[int], x:int) -> int: |
| 5 | + """ |
| 6 | + ์ ๋ ฌ๋ ๋ฆฌ์คํธ a์ x๋ฅผ ์ฝ์
ํ ๊ฐ์ฅ ์ผ์ชฝ ์ธ๋ฑ์ค ๋ฐํ |
| 7 | + """ |
| 8 | + # x๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์ฒซ ๋ฒ์งธ ์์์ ์ธ๋ฑ์ค ์ฐพ์์ฃผ๊ธฐ |
| 9 | + # bisect.bisect_left(a, x)๋ฅผ ์ง์ ๊ตฌํ |
| 10 | + low = 0 # ์์ ์ธ๋ฑ์ค, 0์ผ๋ก ์ด๊ธฐํ |
| 11 | + high = len(a) # ๋ ์ธ๋ฑ์ค, ๋ฆฌ์คํธ์ ๊ธธ์ด๋ก ์ด๊ธฐํ |
| 12 | + |
| 13 | + while low < high: |
| 14 | + mid = low + (high - low) // 2 |
| 15 | + if a[mid] < x: |
| 16 | + low = mid + 1 |
| 17 | + else: # a[mid] >= x |
| 18 | + high = mid |
| 19 | + return low # low๊ฐ ์ฝ์
์ง์ |
| 20 | + |
| 21 | + def lengthOfLIS(self, nums: List[int]) -> int: |
| 22 | + """ |
| 23 | + """ |
| 24 | + if not nums: # nums๊ฐ ๋น ๋ฐฐ์ด์ด๋ผ๋ฉด ๋จผ์ 0 ๋ฐํ |
| 25 | + return 0 |
| 26 | + tails = [] # ๊ฐ ๊ธธ์ด์ LIS๋ฅผ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ์์ ๋ง์ง๋ง ๊ฐ์ ์ ์ฅํ ๋ฆฌ์คํธ |
| 27 | + for num in nums: |
| 28 | + # num์ ์ฝ์
ํ ์ ์๋ ๊ฐ์ฅ ์ผ์ชฝ ์์น ์ฐพ๊ธฐ |
| 29 | + # -> tails ๋ฆฌ์คํธ์์ num ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์ฒซ ๋ฒ์งธ ์์ ์ธ๋ฑ์ค ์ฐพ๊ธฐ |
| 30 | + # -> ๋ง์ฝ tails ๋ชจ๋ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด ์ถ๊ฐํ ์์น๋ฅผ ๋ฐํํจ |
| 31 | + idx = self._my_bisect_left(tails, num) |
| 32 | + |
| 33 | + # ๋ง์ฝ idx๊ฐ tails ํ์ฌ ๊ธธ์ด์ ๊ฐ๋ค๋ฉด |
| 34 | + # -> num์ด tails์ ๋ชจ๋ ์์๋ณด๋ค ํฌ๋ค |
| 35 | + # -> tails์ num "์ถ๊ฐ" |
| 36 | + if idx == len(tails): |
| 37 | + tails.append(num) |
| 38 | + # ๋ง์ฝ idx๊ฐ tails ํ์ฌ ๊ธธ์ด๋ณด๋ค ์๋ค๋ฉด |
| 39 | + # -> ๊ฐ๋ฅ์ฑ ๋ฐ๊ฒฌ, tails[idx]๋ฅผ num์ผ๋ก "๊ต์ฒด" |
| 40 | + # -> LIS๋ฅผ ๊ฐ์ |
| 41 | + else: |
| 42 | + tails[idx] = num |
| 43 | + |
| 44 | + # ๋ชจ๋ ์ซ์ ์ฒ๋ฆฌ ํ, tails ๊ธธ์ด๊ฐ LIS๊ธธ์ด๊ฐ ๋จ |
| 45 | + return len(tails) |
| 46 | + |
| 47 | + |
| 48 | + """ |
| 49 | + def lengthOfLIS_bruteforce(self, nums: List[int]) -> int: |
| 50 | + # ์ด๊ธฐ์ ๊ตฌํํ ํ์ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ |
| 51 | + # --- ๋ณต์ก๋ --- |
| 52 | + # Time Complexity: O(n^2) |
| 53 | + # Space Complexity: O(1) |
| 54 | + # --- ํ๊ณ --- |
| 55 | + # [์ง๊ธ ๋น์ฅ ๊ฐ์ฅ ์ข์๋ณด์ด๋ ์ ํ์ด ์ ์ฒด์ ์ผ๋ก๋ ์ต์ ์ด ์๋ ๊ฒฝ์ฐ] |
| 56 | + # nums = [0,1,0,3,2,3] ๊ฐ์ ๊ฒฝ์ฐ ๋ต์ ์ฐพ์ง ๋ชปํจ (์์ธก ๊ฐ: 4, ์ค์ ๊ฐ: 3) |
| 57 | + # ๊ฐ ์์์์ ์์ํ์ฌ ํ์์ ์ผ๋ก ๋ค์ ํฐ ์๋ฅผ ์ฐพ์๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ชจ๋ LIS๋ฅผ ์ฐพ์ ์ ์์ |
| 58 | + # ๊ฐ ์์์ ์์ ํ๋์ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ์ฐพ๋ ๊ฒ, ํญ์ ๊ธด ๊ฒ์ ๋ณด์ฅํ ์ ์์ |
| 59 | + # ์ด๋ฏธ ์ฐพ์ LIS ๋ค์ ๋ ๊ธด LIS๊ฐ ์๋ค๋ฉด ์ฐพ์ ์ ์์ |
| 60 | + n = len(nums) # n์ nums์ ๊ธธ์ด(๊ฐ์) |
| 61 | + if n == 0: # ๊ธธ์ด๊ฐ 0์ด๋ฉด ์ฐ์ ์ ์ผ๋ก 0์ ๋ฐํ |
| 62 | + return 0 |
| 63 | + |
| 64 | + max_overall_length = 0 # ์ ์ฒด ์ต๋ ๊ธธ์ด, 0์ผ๋ก ์ด๊ธฐํ |
| 65 | +
|
| 66 | + for idx_i in range(n): # 0๋ถํฐ n๊น์ง ์ํํ๋ ์ธ๋ถ ๋ฃจํ |
| 67 | + current_length = 1 # ํ์ฌ(index: idx_i) ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ 1๋ก ์ด๊ธฐํ |
| 68 | + last_element_in_subsequence = nums[idx_i] # ๋ถ๋ถ ์์ด์ ๋ง์ง๋ง ์ซ์๋ฅผ ํ์ฌ ์ซ์๋ก ์ด๊ธฐํ |
| 69 | +
|
| 70 | + for idx_j in range(idx_i + 1, n): # ๋ค์ ์์์ ์ธ๋ฑ์ค๋ฅผ idx_j๋ก ํ์ฌ ๋๊น์ง ์ํ |
| 71 | + # ๋ง์ฝ ๋ค์ ์์๊ฐ ๋ถ๋ถ ์์ด์ ๋ง์ง๋ง ์ซ์๋ณด๋ค ํฌ๋ค๋ฉด |
| 72 | + if nums[idx_j] > last_element_in_subsequence: |
| 73 | + # ๋ง์ง๋ง ์ซ์๋ฅผ ๋ค์ ์์๋ก ๊ฐฑ์ |
| 74 | + last_element_in_subsequence = nums[idx_j] |
| 75 | + # ํ์ฌ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ 1 ์ฆ๊ฐ |
| 76 | + current_length += 1 |
| 77 | +
|
| 78 | + # ํ์ฌ ๋ถ๋ถ ์์ด ๊ธธ์ด๊ฐ ์ ์ฒด ๋ถ๋ถ ์์ด ๊ธธ์ด๋ณด๋ค ํฐ ๊ฒฝ์ฐ ๊ฐฑ์ |
| 79 | + max_overall_length = max(max_overall_length, current_length) |
| 80 | +
|
| 81 | + return max_overall_length |
| 82 | + """ |
0 commit comments