class Solution(object):
def lengthOfLIS(self, nums):
# ์์๊ฐ ๋ค์ด๊ฐ ์์น ์ฐพ๊ธฐ
def bs(sub,target):
left = 0
right = len(sub)-1
while left<=right:
mid = (left+right)//2
if sub[mid] < target:
left = mid+1
else:
right = mid-1
return left
sub = [nums[0]]
for i in range(1,len(nums)):
if sub[-1]<nums[i]:
sub.append(nums[i])
else:
idx = bs(sub,nums[i])
sub[idx]=nums[i]
return len(sub)
์์ ์ฒ๋ผ
[10, 9, 2, 5, 3, 7, 101, 18] ์ด ์๋ค๊ณ ํ ๋, ๋ถ๋ถ์งํฉ์ ์ฆ๊ฐํ๊ฒ๋ ๊ณ์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
1. ์ฒซ ์์์ธ 10์ ๋น๊ต ๋์์ด ์์ผ๋ฏ๋ก ๋ฐ๋ก ์ถ๊ฐํ๋ค.
sub = [10]
2. ๋๋ฒ์งธ ์์์ธ 9๋ 10๋ณด๋ค ์๊ณ ์ฆ๊ฐํ๋ ๋ถ๋ถ์งํฉ์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ 10์ ์ ์ธํ๊ณ 9๋ก ์ ๋ฐ์ดํธํ๋ค.
sub = [9]
3. ์ธ๋ฒ์งธ ์์์ธ 2๋ 9๋ณด๋ค ์๊ณ ์ฆ๊ฐํ๋ ๋ถ๋ถ์งํฉ์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ 9๋ฅผ ์ ์ธํ๊ณ ์ ๋ฐ์ดํธํ๋ค.
sub = [2]
4. ๋ค๋ฒ์งธ ์์์ธ 5 ๋ 2๋ณด๋ค ์ปค์ ์ฆ๊ฐํ๋ ๋ถ๋ถ์งํฉ์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐํ๋ค.
sub = [2, 5]
5. ๋ค์ฏ๋ฒ์งธ ์์์ธ 3์ 5๋ณด๋ค๋ ์์ง๋ง 2๋ณด๋ค๋ ํฌ๋ค. ๋ฐ๋ผ์ 5๋์ 3์ผ๋ก ์์๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
sub = [2, 3]
6. ์ฌ์ฏ๋ฒ์งธ ์์์ธ 7 ์ 3๋ณด๋ค ํฌ๋ฏ๋ก ๋ฐ๋ก ์ถ๊ฐํ๋ค.
sub = [2, 3, 7]
7. ์ผ๊ณฑ๋ฒ์งธ ์์์ธ 101๋ณด 7๋ณด๋ค ํฌ๋ฏ๋ก ๋ฐ๋ก ์ถ๊ฐํ๋ค.
sub = [2, 3, 7, 101]
8. ์ฌ๋๋ฒ์งธ ์์์ธ 18์ 101๋ณด๋ค๋ ์์ง๋ง 7๋ณด๋ค๋ ํฌ๋ฏ๋ก 101๋์ 18๋ก ์ ๋ฐ์ดํธํ๋ค.
sub = [2, 3, 7, 18]
๋ง๋ค ์ ์๋ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์งํฉ์ [2, 3, 7, 18] ์ด ๋๋ค.
์๋ฆฌ๋, ๋ถ๋ถ์งํฉ์ ์ฆ๊ฐํ ์ ์๋๋ก ๊ณ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด๊ณ
๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ด๋ถํ์์ ํตํด์ ๊ต์ฒดํด์ผํ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์์ผํ๋ค.
ํ์ด์ฌ์์ ์ ๊ณตํ๋ bisect_left() ํจ์๋ก ์์น๋ฅผ ์ฐพ์ ์๋ ์์ง๋ง, ํจ์๋ฅผ ์ง์ ์์ฑํด์ ๊ตฌํํ์๋ค.