Skip to content

Commit 9cf961f

Browse files
committed
longest-increasing-subsequence solution (py, ts)
1 parent d7bb9cb commit 9cf961f

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"""
2+
์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฐฐ์—ด nums์—์„œ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
3+
4+
๋™์  ๊ณ„ํš๋ฒ•, ์ด์ค‘ ํฌ๋ฌธ ํ’€์ด - TC: O(n^2), SC: O(n)
5+
6+
dp[i]: nums[i]๋กœ ๋๋‚˜๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ ์ˆ˜์—ด์˜ ๊ธธ์ด. ์ดˆ๊ธฐ๊ฐ’์€ ๋ชจ๋‘ 1 (์ž๊ธฐ ์ž์‹ ๋งŒ ์žˆ์„ ๋•Œ)
7+
8+
์˜ค๋ฆ„์ฐจ์ˆœ ๋ถ€๋ถ„ ์ˆ˜์—ด -> ์•ž์— ์žˆ๋Š” ์ˆ˜๊ฐ€ ๋’ค์— ์žˆ๋Š” ์ˆ˜๋ณด๋‹ค ์ž‘์•„์•ผ ํ•จ.
9+
"""
10+
11+
class Solution:
12+
def lengthOfLIS(self, nums: List[int]) -> int:
13+
n = len(nums)
14+
dp = [1] * n
15+
for i in range(n):
16+
for j in range(i):
17+
if nums[j] < nums[i]: # ์˜ค๋ฆ„์ฐจ์ˆœ ์กฐ๊ฑด ๋งŒ์กฑํ•œ๋‹ค๋ฉด
18+
dp[i] = max(dp[i], dp[j] + 1) # ํ˜„์žฌ์™€ nums[j] ๋’ค์— nums[i]๋ฅผ ๋ถ™์ธ ์ˆ˜์—ด ์ค‘ ๋” ๊ธด ๊ธธ์ด ์„ ํƒ
19+
return max(dp) # ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ ์ˆ˜์—ด์˜ ๊ธธ์ด
20+
21+
22+
"""
23+
์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฐฐ์—ด nums์—์„œ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
24+
25+
์ด๋ถ„ ํƒ์ƒ‰ ํ’€์ด - TC: O(n log n), SC: O(n)
26+
27+
# bisect๋ž€?
28+
bisect๋Š” Python์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ์— ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๋ชจ๋“ˆ.
29+
30+
bisect_left(arr, x):
31+
- x๋ฅผ ์‚ฝ์ž…ํ•  ๊ฐ€์žฅ ์™ผ์ชฝ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜
32+
= ์ •๋ ฌ๋œ ์˜ค๋ฆ„์ฐจ์ˆœ ๋ฐฐ์—ด arr์—์„œ x๋ฅผ ๋ผ์›Œ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์™ผ์ชฝ ์œ„์น˜ (index) ์ฐพ์•„์คŒ
33+
- ๊ฐ™์€ ๊ฐ’์ด ์žˆ์–ด๋„ ๊ทธ ์•ž์— ๋ผ์›Œ ๋„ฃ์Œ
34+
35+
bisect_right(arr, x):
36+
- ์˜ค๋ฅธ์ชฝ ๊ฒฝ๊ณ„ = ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด arr์—์„œ, ๊ฐ’ x๋ฅผ ์‚ฝ์ž…ํ•  ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์œ„์น˜
37+
- ๊ฐ™์€ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ทธ ๋’ค์— ๋ผ์›Œ ๋„ฃ์Œ
38+
39+
ํ•ด๋‹น ๋ฌธ์ œ๋Š” Strictly Increasing ์ˆ˜์—ด์ด๋ฏ€๋กœ ๊ฐ™์€ ์ˆซ์ž๋ฅผ ํ—ˆ์šฉ x
40+
-> ๊ฐ™์€ ๊ฐ’์ด ๋“ค์–ด์˜ค๋ฉด ๊ธฐ์กด ๊ฐ’์„ ๋Œ€์ฒดํ•ด์•ผ์ง€, ๊ทธ ๋’ค์— ์ถ”๊ฐ€ํ•˜๋ฉด ์•ˆ๋˜๋ฏ€๋กœ bisect_left ์‚ฌ์šฉํ•œ๋‹ค.
41+
"""
42+
import bisect
43+
44+
class Solution:
45+
def lengthOfLIS(self, nums: List[int]) -> int:
46+
tail = [] # ๊ฐ ๊ธธ์ด๋ณ„ ์ฆ๊ฐ€ ์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’(๊ฐ€์žฅ ์ž‘์€ ๊ฐ’)์„ ์ €์žฅ
47+
for num in nums:
48+
idx = bisect.bisect_left(tail, num)
49+
if idx == len(tail): # ๋ฐ˜ํ™˜๋œ idx๊ฐ€ tail์˜ ๋ ๋ถ€๋ถ„์ด๋ผ๋ฉด ํ˜„์žฌ ์ˆ˜์—ด ๋์— ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป, ์ฆ‰ num์ด tail ์•ˆ์˜ ๋ชจ๋“  ๊ฐ’๋ณด๋‹ค ํผ
50+
tail.append(num) # ์ˆ˜์—ด ๊ธธ์ด ๋Š˜๋ฆผ
51+
else:
52+
tail[idx] = num # ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
53+
return len(tail)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* ์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฐฐ์—ด nums์—์„œ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
3+
*
4+
* new Array(n).fill(1) -> ๊ธธ์ด๊ฐ€ n์ธ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด, ๋ชจ๋“  ์š”์†Œ๋ฅผ 1๋กœ ์ฑ„์›€
5+
*
6+
* TC: O(n^2), SC: O(n)
7+
*/
8+
9+
function lengthOfLIS(nums: number[]): number {
10+
const n = nums.length;
11+
const dp = new Array(n).fill(1); // In Python => [1] * n
12+
13+
for (let i = 0; i < n; i++) {
14+
for (let j = 0; j < i; j++) {
15+
if (nums[j] < nums[i]) {
16+
dp[i] = Math.max(dp[j] + 1, dp[i]);
17+
}
18+
}
19+
}
20+
return Math.max(...dp); // ์ˆซ์ž ๋ฐฐ์—ด์„ ํŽผ์ณ ์—ฌ๋Ÿฌ ์ˆซ์ž๋ฅผ ๋„˜๊ฒจ์ค˜์•ผ ํ•จ
21+
}

0 commit comments

Comments
ย (0)