[alphaorderly] WEEK 08 Solutions - #2810
Conversation
๐ alphaorderly ๋์ ํ์ต ํํฉ์ด๋ฒ ์ฃผ ์ ์ถ ๋ฌธ์
๋์ ํ์ต ์์ฝ
๋ฌธ์ ํ์ด ํํฉ
๐ค ์ด ๋๊ธ์ GitHub App์ ํตํด ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค. ๐ข API ์ฌ์ฉ๋ (gpt-5-nano)
|
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
clone-graph/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋ : O(V + E)
๊ณต๊ฐ๋ณต์ก๋ : O(V)
1. made ๋์
๋๋ฆฌ๋ฅผ ์ด๊ธฐํํ๋ค.
2. copy_node ํจ์๋ฅผ ์ ์ํ๋ค.
3. copy_node ํจ์๋ target ๋
ธ๋๋ฅผ ๋ณต์ฌํ ํ ๋ฐํํ๋ค.
4. ์ด๋ฏธ ๋ณต์ฌํ ๋
ธ๋๋ made์์ ์ฌ์ฌ์ฉํ๋ค.
5. ๋ณต์ฌํ ๋
ธ๋์ ์ด์๋ค ๋ํ copy_node๋ฅผ ์ด์ฉํด ์ฌ๊ท์ ์ผ๋ก ๋ณต์ฌํ๋ค.
6. ์ต์ข
์ ์ผ๋ก ๋ณต์ ๋ ๊ทธ๋ํ์ ์์ ๋
ธ๋๋ฅผ ๋ฐํํ๋ค.
"""
class Solution:
def cloneGraph(self, node: Optional["Node"]) -> Optional["Node"]:
made = dict()
def copy_node(target: Node) -> Node:
if not target:
return None
copied = Node(target.val)
made[target.val] = copied
for nei in target.neighbors:
if nei.val in made:
copied.neighbors.append(made[nei.val])
else:
copied.neighbors.append(copy_node(nei))
return copied
return copy_node(node)- ํจํด: Depth-First Search, Hash Map / Hash Set
- ์ค๋ช : ๊ทธ๋ํ์ ๊ฐ ๋ ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ฉฐ ์ด์ ๋ ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ณต์ ํ๋ค. ์ด๋ฏธ ๋ณต์ ๋ ๋ ธ๋๋ฅผ ํด์ ๋งต์ผ๋ก ์ฌ์ฌ์ฉํ์ฌ ์ํ๊ณผ ์ค๋ณต ๋ฐฉ๋ฌธ์ ๋ฐฉ์งํ๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(V + E) |
| Space | O(V) |
ํผ๋๋ฐฑ: ๊ฐ ๋ ธ๋๋ฅผ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๊ณ ์ด์ ๋ ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ณต์ ํ๋ฏ๋ก ์ ์ฒด ๊ทธ๋ํ์ ๋ ธ๋ ์์ ๊ฐ์ ์์ ๋น๋กํ๋ ์๊ฐ ๋ณต์ก๋์ ๋ ธ๋ ์์ ๋น๋กํ๋ ์ถ๊ฐ ๊ณต๊ฐ์ด ํ์ํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
longest-common-subsequence/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋ : O(T1 * T2)
๊ณต๊ฐ๋ณต์ก๋ : O(T1) # T1์ ์งง์ ๋ฌธ์์ด์ ์ค์ ํ๊ธฐ์ ๊ณต๊ฐ๋ณต์ก๋๋ T1์ด ๋๋ค.
1. text1๊ณผ text2 ์ค ๋ ์งง์ ์ชฝ์ text1์ผ๋ก ์ค์ ํ๋ค.
2. T1๊ณผ T2๋ฅผ ๊ฐ๊ฐ text1๊ณผ text2์ ๊ธธ์ด๋ก ์ค์ ํ๋ค.
3. dp ๋ฐฐ์ด์ T1 + 1 ํฌ๊ธฐ๋ก 0์ผ๋ก ์ด๊ธฐํํ๋ค.
4. text2์ ๊ฐ ๋ฌธ์(i)๋ฅผ ์ํํ๋ฉด์ ๋น๊ตํ๋ค.
5. new_dp ๋ฐฐ์ด์ T1 + 1 ํฌ๊ธฐ๋ก 0์ผ๋ก ์ด๊ธฐํํ๋ค.
6. text1์ ๊ฐ ๋ฌธ์(j)์ ๋ํด ์ํํ๋ฉด์ ๋น๊ตํ๋ค.
7. text2[i - 1]๊ณผ text1[j - 1]๊ฐ ๊ฐ์ผ๋ฉด, new_dp[j]๋ฅผ dp[j - 1] + 1๋ก ์ค์ ํ๋ค.
8. ๋ค๋ฅด๋ฉด, new_dp[j]๋ฅผ max(new_dp[j - 1], dp[j])๋ก ์ค์ ํ๋ค.
9. dp๋ฅผ new_dp๋ก ๊ฐฑ์ ํ๊ณ , ๋ง์ง๋ง ์์๋ฅผ ๋ฐํํ๋ค.
"""
class Solution:
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
if len(text1) > len(text2):
text1, text2 = text1, text2
T1, T2 = len(text1), len(text2)
dp = [0] * (T1 + 1)
for i in range(1, T2 + 1):
new_dp = [0] * (T1 + 1)
for j in range(1, T1 + 1):
if text2[i - 1] == text1[j - 1]:
new_dp[j] = dp[j - 1] + 1
else:
new_dp[j] = max(new_dp[j - 1], dp[j])
dp = new_dp
return dp[-1]- ํจํด: Dynamic Programming, Two Pointers
- ์ค๋ช : ๋ ๋ฌธ์์ด์ ๋ถ๋ถ์์ด ๋ฌธ์ ๋ฅผ DP๋ก ํด๊ฒฐํ๋ ์ ํ์ ์ธ ํจํด์ผ๋ก, ๊ฐ ์์น์ ๋ถ๋ถ๋ฌธ์์ด ์กฐํฉ์ ๋ํ ์ต์ฅ ๊ณตํต ๋ถ๋ถ์์ด ๊ธธ์ด๋ฅผ ์ ์ง์ ์ผ๋ก ๊ณ์ฐํ๋ค. ๋ํ ๊ธธ์ด๊ฐ ์๋ก ๋ค๋ฅธ ๋ ๋ฌธ์์ด์ ๋ํด ๊ฐ์ ์ ์ผ๋ก ๋ ํฌ์ธํฐ์ฒ๋ผ ์ธ๋ฑ์ค ์ํ์ DP ๋ฐฐ์ด ๊ฐฑ์ ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(T1 * T2) |
| Space | O(T1) |
ํผ๋๋ฐฑ: ๊ณต๊ฐ์ ์ค์ด๊ธฐ ์ํด ๋ ์ด ๋ฐฐ์ด์ ๊ต์ฒดํ๋ฉฐ ์๊ฐ ๋ณต์ก๋๋ ๋ ๋ฌธ์์ด ๊ธธ์ด์ ๊ณฑ์ด๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
longest-repeating-character-replacement/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋ : O(N)
๊ณต๊ฐ๋ณต์ก๋ : O(1)
1. freq ๋์
๋๋ฆฌ๋ฅผ ์ด๊ธฐํํ๋ค.
2. s์ ๊ฐ ๋ฌธ์(value)์ ๋ํด ๋ฃจํ๋ฅผ ๋๋ค.
3. freq[value]๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
4. maxima๋ฅผ ํ์ฌ ์๋์ฐ์์ ๊ฐ์ฅ ๋น๋๊ฐ ๋์ ๋ฌธ์ ๋น๋๋ก ๊ฐฑ์ ํ๋ค.
5. ์๋์ฐ ํฌ๊ธฐ์์ maxima์ ๊ฐ๋งํผ์ ๋บ ๊ฐ์ด k๋ณด๋ค ํฌ๋ฉด,
6. freq[s[left]]๋ฅผ 1 ๊ฐ์์ํค๊ณ left๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
7. ans๋ฅผ ์๋์ฐ์ ์ต๋ ๊ธธ์ด๋ก ๊ฐฑ์ ํ๋ค.
8. ๋ง์ง๋ง์ผ๋ก ans๋ฅผ ๋ฐํํ๋ค.
"""
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
freq = defaultdict(int)
# maxima : ํ์ฌ ์๋์ฐ ๋ด์์ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ ๋ฌธ์์ ๋น๋์
maxima = left = ans = 0
for right, value in enumerate(s):
freq[value] += 1
maxima = max(maxima, freq[value])
while (right - left + 1) - maxima > k:
freq[s[left]] -= 1
left += 1
ans = max(ans, right - left + 1)
return ans
"""
์๊ฐ๋ณต์ก๋ : O(log N)
๊ณต๊ฐ๋ณต์ก๋ : O(N)
### ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ๊ตฌํ ### (์๋์ฐ ๋ด ์ ์ฒด๋ง ์ฌ์ฉํ๋ฏ๋ก query ๊ตฌํ ์์)
#### ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ์๋ฆฌ
- ๊ฐ ์ํ๋ฒณ ๋น๋ ํฉ๊ณผ ๋น๋๊ฐ ๊ฐ์ฅ ๋์ ๋ฌธ์์ ๋น๋๋ฅผ ์ ์ฅํ๋ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
#### ์ฝ๋ ์ค๋ช
- window.update๋ก ์ํ๋ฒณ ๊ฐ์๋ฅผ ๊ฐฑ์ ํ๋ฉฐ,
- window.tree[1][0]์์ ํ์ฌ ์๋์ฐ ๋ด ์ ์ฒด ๋ฌธ์ ์,
- window.tree[1][1]์์ ์๋์ฐ ๋ด ๋ฑ์ฅ ๋น๋๊ฐ ๊ฐ์ฅ ๋์ ๋ฌธ์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
- ์๋์ฐ ํฌ๊ธฐ - ์ต๋ ๋น๋๊ฐ k๋ฅผ ์ด๊ณผํ๋ฉด left๋ฅผ ์ฎ๊ธฐ๋ฉฐ ์๋์ฐ๋ฅผ ์ค์ธ๋ค.
> ๋ถํ์ํ๊ฒ ๋ณต์กํ ๊ตฌํ์ด์ง๋ง, ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ฅผ ๊ณต๋ถํ๊ธฐ์ ์ข์ ์์ ๊ฐ ๋ ์ ์๋ค.
"""
class SegTree:
def __init__(self):
# [๋ฌธ์ ๊ฐ์ ํฉ, ์ต๋๊ฐ]
self.tree = [[0, 0] for _ in range(26 * 4 + 1)]
def _update(
self,
node_index: int,
target_index: int,
target_update: int,
seg_left: int,
seg_right: int,
):
if seg_left == seg_right:
self.tree[node_index][0] += target_update
self.tree[node_index][1] += target_update
return
mid = (seg_left + seg_right) // 2
if target_index <= mid:
self._update(node_index * 2, target_index, target_update, seg_left, mid)
else:
self._update(
node_index * 2 + 1, target_index, target_update, mid + 1, seg_right
)
self.tree[node_index][0] = (
self.tree[node_index * 2][0] + self.tree[node_index * 2 + 1][0]
)
self.tree[node_index][1] = max(
self.tree[node_index * 2][1], self.tree[node_index * 2 + 1][1]
)
def update(self, target: str, update: int):
self._update(1, ord(target) - ord("A"), update, 0, 25)
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
left = 0
window = SegTree()
ans = 0
for right, value in enumerate(s):
window.update(value, 1)
while window.tree[1][0] > 0 and window.tree[1][0] - window.tree[1][1] > k:
window.update(s[left], -1)
left += 1
ans = max(ans, right - left + 1)
return ans- ํจํด: Sliding Window, Greedy
- ์ค๋ช : ์ฒซ ๋ฒ์งธ ๊ตฌํ์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์ด์ฉํด ๋ฌธ์ ๋น๋ ์ฐจ์ด๋ฅผ k ์ดํ๋ก ์ ์งํ๋ฉฐ ์๋์ฐ ๊ธธ์ด๋ฅผ ํ์ฅํ๋ ํจํด์ด๊ณ , ๋ ๋ฒ์งธ ๊ตฌํ๋ ์๋์ฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ฉฐ ์ต๋ ๋น๋์์ ์ฐจ์ด๊ฐ k๋ฅผ ๋์ง ์๋๋ก ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ด๋ํ๋ ๊ทธ๋ฆฌ๋ ์ฑ๊ฒฉ์ ์ ๊ทผ์ด๋ค. ๋ ๋ฐฉ๋ฒ ๋ชจ๋ ๋ฌธ์์ด ๋ด ์ ์ ํ ๋ถ๋ถ๋ฌธ์์ด ๊ธธ์ด๋ฅผ ์ต์ ํํ๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
โน๏ธ ์ด ํ์ผ์๋ 2๊ฐ์ง ํ์ด๊ฐ ํฌํจ๋์ด ์์ด ๊ฐ๊ฐ ๋ถ์ํฉ๋๋ค.
ํ์ด 1: Solution.characterReplacement โ Time: O(N) / Space: O(1)
| ๋ณต์ก๋ | |
|---|---|
| Time | O(N) |
| Space | O(1) |
ํผ๋๋ฐฑ: ์๋์ฐ ์์ ๋ฌธ์ ๋น๋์ ์ถ์ ์ผ๋ก ์ต๋ ๊ธธ์ด๋ฅผ ๊ฒฐ์ ํ๋ค. ์ต๋ ๋น๋์๋ฅผ ์ ์งํ๋ ๋ฐฉ์์ด ํต์ฌ์ด๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
ํ์ด 2: SegTree โ Time: O(log N) / Space: O(N)
| ๋ณต์ก๋ | |
|---|---|
| Time | O(log N) |
| Space | O(N) |
ํผ๋๋ฐฑ: ๋ณต์ก๋๊ฐ ๋ถํ์ํ๊ฒ ์ปค์ง๋ ์์ ์ง๋ง ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ํ์ต์ ์ ์ฉํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
palindromic-substrings/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋ : O(N^2)
๊ณต๊ฐ๋ณต์ก๋ : O(1)
1. n์ s์ ๊ธธ์ด๋ก ์ค์ ํ๋ค.
2. count๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
3. ๊ฐ ๋ฌธ์๋ฅผ ์ค์ฌ(center)์ผ๋ก ํ์ฅํ์ฌ ํ์ ๊ธธ์ด์ ํฐ๋ฆฐ๋๋กฌ์ ์ผ๋ค.
- radius๋ฅผ 0๋ถํฐ ์์ํด, center - radius >= 0, center + radius < n ์ด๊ณ s[center - radius] == s[center + radius]์ธ ๋์ count๋ฅผ 1 ์ฆ๊ฐ, radius += 1 ํ๋ค.
4. ๊ฐ ๋ฌธ์ ์(center, center+1)์ ์ค์ฌ์ผ๋ก ํ์ฅํ์ฌ ์ง์ ๊ธธ์ด์ ํฐ๋ฆฐ๋๋กฌ์ ์ผ๋ค.
- radius๋ฅผ 0๋ถํฐ ์์ํด, center - radius >= 0, center + radius + 1 < n ์ด๊ณ s[center - radius] == s[center + radius + 1]์ธ ๋์ count๋ฅผ 1 ์ฆ๊ฐ, radius += 1 ํ๋ค.
5. ์ด ํฐ๋ฆฐ๋๋กฌ ๋ถ๋ถ ๋ฌธ์์ด ๊ฐ์์ธ count๋ฅผ ๋ฐํํ๋ค.
"""
class Solution:
def countSubstrings(self, s: str) -> int:
n = len(s)
count = 0
for center in range(n):
radius = 0
# ํ์ ๊ธธ์ด ํฐ๋ฆฐ๋๋กฌ (center๋ฅผ ๊ธฐ์ค)
while (
center - radius >= 0
and center + radius < n
and s[center - radius] == s[center + radius]
):
count += 1
radius += 1
radius = 0
# ์ง์ ๊ธธ์ด ํฐ๋ฆฐ๋๋กฌ (center, center+1์ ๊ธฐ์ค)
while (
center - radius >= 0
and center + radius + 1 < n
and s[center - radius] == s[center + radius + 1]
):
count += 1
radius += 1
return count- ํจํด: Two Pointers, Monotonic Stack, Dynamic Programming
- ์ค๋ช : ๋ฌธ์์ด์ ์ค์ฌ์์ ํ์ฅํ๋ฉฐ ํฐ๋ฆฐ๋๋กฌ์ ํ์ํ๋ ๋ฐฉ์์ผ๋ก, ํ์/์ง์ ์ค์ฌ์ ๊ฐ๊ฐ ํ์ฅํ๋ ๋ ํฌ์ธํฐ(์ผํฐ-ํ์ฅ) ๊ธฐ๋ฒ์ด๋ค. ๊ฐ ํ์ฅ์์ ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํ๋ฉฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค๋ฏ๋ก ํ ์์น์์์ ๋น๊ต๋ก ์ ์ฒด๋ฅผ ํ์ํ๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(N^2) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๊ฐ์ด๋ฐ๋ฅผ ํ์ฅํ๋ ๋ฐฉ์์ผ๋ก ๋ชจ๋ ํ/์ง์ ๊ธธ์ด ํฐ๋ฆฐ๋๋กฌ์ ํ์งํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
reverse-bits/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(1) # 32๋ฒ๋ง ๋ฐ๋ณตํ๋ฏ๋ก ํญ์ ์์ ์๊ฐ ๋ณต์ก๋์
๊ณต๊ฐ๋ณต์ก๋: O(1)
1. ans๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
3. ans๋ฅผ ์ผ์ชฝ์ผ๋ก 1๋นํธ ์ํํธํ ํ, n์ ๋ง์ง๋ง ๋นํธ๋ฅผ OR ์ฐ์ฐํ๋ค.
4. n์ ์ค๋ฅธ์ชฝ์ผ๋ก 1๋นํธ ์ํํธํ๋ค.
- 3, 4 ๊ณผ์ ์ 32๋ฒ ๋ฐ๋ณตํ๋ค.
5. ans๋ฅผ ๋ฐํํ๋ค.
"""
class Solution:
def reverseBits(self, n: int) -> int:
ans = 0
for _ in range(32):
ans = (ans << 1) | (n & 1)
n >>= 1
return ans- ํจํด: Bit Manipulation, Divide and Conquer, Greedy
- ์ค๋ช : ๋นํธ ์กฐ์์ผ๋ก ๊ฐ ๋นํธ๋ฅผ ์ข์ฐ๋ก ์ด๋์ํค๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ์ฑํ๋ ํจํด์ผ๋ก, ๋ฐ๋ณต๋ฌธ ๋ด์์ ๋นํธ๋ฅผ shift/OR๋ก ์ฒ๋ฆฌํ๋ ๋นํธ ์ฐ์ฐ ๊ธฐ๋ฒ์ด๋ค. ์ ๋ ฅ ๋นํธ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํด ์ต์ข ๊ฐ์ ์ป๋ ๋ฐฉ์์ ๋จ์ํ๊ณ ๋ช ์์ ์ด๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(1) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๊ณ ์ ๋ ๋นํธ ์๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ๋นํธ๋ฅผ ๋ค์ง๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
longest-repeating-character-replacement/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋ : O(N)
๊ณต๊ฐ๋ณต์ก๋ : O(1)
1. freq ๋์
๋๋ฆฌ๋ฅผ ์ด๊ธฐํํ๋ค.
2. s์ ๊ฐ ๋ฌธ์(value)์ ๋ํด ๋ฃจํ๋ฅผ ๋๋ค.
3. freq[value]๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
4. maxima๋ฅผ ํ์ฌ ์๋์ฐ์์ ๊ฐ์ฅ ๋น๋๊ฐ ๋์ ๋ฌธ์ ๋น๋๋ก ๊ฐฑ์ ํ๋ค.
5. ์๋์ฐ ํฌ๊ธฐ์์ maxima์ ๊ฐ๋งํผ์ ๋บ ๊ฐ์ด k๋ณด๋ค ํฌ๋ฉด,
6. freq[s[left]]๋ฅผ 1 ๊ฐ์์ํค๊ณ left๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
7. ans๋ฅผ ์๋์ฐ์ ์ต๋ ๊ธธ์ด๋ก ๊ฐฑ์ ํ๋ค.
8. ๋ง์ง๋ง์ผ๋ก ans๋ฅผ ๋ฐํํ๋ค.
"""
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
freq = defaultdict(int)
# maxima : ํ์ฌ ์๋์ฐ ๋ด์์ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ ๋ฌธ์์ ๋น๋์
maxima = left = ans = 0
for right, value in enumerate(s):
freq[value] += 1
maxima = max(maxima, freq[value])
while (right - left + 1) - maxima > k:
freq[s[left]] -= 1
left += 1
ans = max(ans, right - left + 1)
return ans
"""
์๊ฐ๋ณต์ก๋: O(NlogN)
- ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ํ ๋ฒ ์
๋ฐ์ดํธ: O(logN)
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ ํ ๋ฒ์ฉ ์ ์ง: O(N)
๊ณต๊ฐ๋ณต์ก๋: O(N)
- ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ํฌ๊ธฐ: O(N) (์ํ๋ฒณ 26๊ฐ์ ๋ํด 4N+1 ๋
ธ๋)
[์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ๊ฐ์]
- ๊ฐ ์ํ๋ฒณ(A~Z)์ ๋น๋์๋ฅผ ํํํ๋ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ฅผ ๊ตฌํํจ.
- ๊ฐ ํธ๋ฆฌ ๋
ธ๋๋ ๊ตฌ๊ฐ ๋ด ํ์ฌ ์ํ๋ฒณ ๋น๋ ์ดํฉ๊ณผ ๊ทธ ๊ตฌ๊ฐ ๋ด ์ต๋น๊ฐ(๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ ์ํ๋ฒณ์ ๋น๋)์ ์ ์ฅํจ.
- ์ด์ง ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ฐ ์ํ๋ฒณ ์ธ๋ฑ์ค๋ฅผ ๋ฆฌํ ๋
ธ๋(0~25)์ ๋งคํ.
[ํต์ฌ ๋์ ์ค๋ช
]
- window.update(๋ฌธ์, ยฑ1): ํ์ฌ ์๋์ฐ์ ์ ๋ฌธ์๋ฅผ ์ถ๊ฐ/์ ๊ฑฐํ ๋ ํด๋น ์ํ๋ฒณ์ ๋น๋์๋ฅผ O(logN)์ ๊ฐฑ์ .
- window.tree[1][0]: ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ๋ฃจํธ์ ์ฒซ ๋ฒ์งธ ๊ฐ์ผ๋ก, ํ์ฌ ์๋์ฐ ๋ด ์ ์ฒด ๋ฌธ์ ๊ฐ์(์๋์ฐ ๊ธธ์ด)๋ฅผ ์๋ฏธ.
- window.tree[1][1]: ๋ฃจํธ์ ๋ ๋ฒ์งธ ๊ฐ์ผ๋ก, ํ์ฌ ์๋์ฐ ๋ด์์ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ ๋ฌธ์์ ๋ฑ์ฅ ํ์๋ฅผ ์๋ฏธ.
- (์๋์ฐ ์ ์ฒด๊ธธ์ด - ์ต๋น๊ฐ) > k ๋ฅผ ๋ง์กฑํ ๋๊น์ง ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ฎ๊ธฐ๋ฉฐ(=์ผ์ชฝ ๋ฌธ์ ์ ๊ฑฐ), ์๋์ฐ๊ฐ k๊ฐ ์ดํ์ ๋ฌธ์๋ง ๋ฐ๊พธ๋ฉด ๋ชจ๋ ๋์ผํ๊ฒ ๋ง๋ค ์ ์๋ ๋ฒ์๋ก ์ถ์.
- ๋งค ๋ฐ๋ณต๋ง๋ค ans๋ฅผ ์ต๋ ์๋์ฐ ํฌ๊ธฐ๋ก ๊ฐฑ์ .
โป ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ์ฌ์ฉ์ ์ด ๋ฌธ์ ์ ์ต์ ํด๋ ์๋๋, ์๋ฃ๊ตฌ์กฐ ํ์ต์๋ ์ข์ ์ฐ์ต ์์ .
"""
class SegTree:
def __init__(self):
# [๋ฌธ์ ๊ฐ์ ํฉ, ์ต๋๊ฐ]
self.tree = [[0, 0] for _ in range(26 * 4 + 1)]
def _update(
self,
node_index: int,
target_index: int,
target_update: int,
seg_left: int,
seg_right: int,
):
if seg_left == seg_right:
self.tree[node_index][0] += target_update
self.tree[node_index][1] += target_update
return
mid = (seg_left + seg_right) // 2
if target_index <= mid:
self._update(node_index * 2, target_index, target_update, seg_left, mid)
else:
self._update(
node_index * 2 + 1, target_index, target_update, mid + 1, seg_right
)
self.tree[node_index][0] = (
self.tree[node_index * 2][0] + self.tree[node_index * 2 + 1][0]
)
self.tree[node_index][1] = max(
self.tree[node_index * 2][1], self.tree[node_index * 2 + 1][1]
)
def update(self, target: str, update: int):
self._update(1, ord(target) - ord("A"), update, 0, 25)
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
left = 0
window = SegTree()
ans = 0
for right, value in enumerate(s):
window.update(value, 1)
while window.tree[1][0] > 0 and window.tree[1][0] - window.tree[1][1] > k:
window.update(s[left], -1)
left += 1
ans = max(ans, right - left + 1)
return ans- ํจํด: Sliding Window, Hash Map / Hash Set, Divide and Conquer
- ์ค๋ช : ์ฒซ ๋ฒ์งธ ๊ตฌํ์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ก ์ฐ์ ๋ถ๋ถ ๋ฌธ์์ด์์ ํ์ ๋ฌธ์ ๊ฐฑ์ ํ์๋ฅผ ๊ด๋ฆฌํ๋ค. freq ํด์ ๋งต์ผ๋ก ๋ฌธ์ ๋น๋๋ฅผ ์ถ์ ํ๊ณ ์๋์ฐ๋ฅผ ์ข์ฐ ํฌ์ธํฐ๋ก ์กฐ์ ํ๋ ํจํด์ด ํต์ฌ์ด๋ค. ๋ ๋ฒ์งธ ๊ตฌํ์ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ก ์๋์ฐ ๋ด๋ถ ๋น๋์ ์ต๋น๊ฐ์ ๊ด๋ฆฌํ์ง๋ง ์ฌ์ ํ ์๋์ฐ ํ์ฅ/์ถ์์ ํ๋ฆ์ Sliding Window์ ๊ฐ๊น๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(N) |
| Space | O(1) |
ํผ๋๋ฐฑ: ํด๋น ํ์ด์์๋ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์ฌ์ฉํด ๊ฐ step์์ ํ์ ์ต์ํ์ ์ ๋ณด๋ฅผ ์ ์งํ๋ค. ๋ค๋ง ์ฃผ์์ ์ ์๋ ์๊ฐ/๊ณต๊ฐ ํ๊ธฐ๊ฐ ์ค์ ๊ตฌํ๊ณผ ๋ค๋ฅด๋ฏ๋ก ๊ตฌํ์ ๋์์ ์ง์คํ๋ฉด ๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
longest-repeating-character-replacement/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋ : O(N)
๊ณต๊ฐ๋ณต์ก๋ : O(1)
1. freq ๋์
๋๋ฆฌ๋ฅผ ์ด๊ธฐํํ๋ค.
2. s์ ๊ฐ ๋ฌธ์(value)์ ๋ํด ๋ฃจํ๋ฅผ ๋๋ค.
3. freq[value]๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
4. maxima๋ฅผ ํ์ฌ ์๋์ฐ์์ ๊ฐ์ฅ ๋น๋๊ฐ ๋์ ๋ฌธ์ ๋น๋๋ก ๊ฐฑ์ ํ๋ค.
5. ์๋์ฐ ํฌ๊ธฐ์์ maxima์ ๊ฐ๋งํผ์ ๋บ ๊ฐ์ด k๋ณด๋ค ํฌ๋ฉด,
6. freq[s[left]]๋ฅผ 1 ๊ฐ์์ํค๊ณ left๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
7. ans๋ฅผ ์๋์ฐ์ ์ต๋ ๊ธธ์ด๋ก ๊ฐฑ์ ํ๋ค.
8. ๋ง์ง๋ง์ผ๋ก ans๋ฅผ ๋ฐํํ๋ค.
"""
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
freq = defaultdict(int)
# maxima : ํ์ฌ ์๋์ฐ ๋ด์์ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ ๋ฌธ์์ ๋น๋์
maxima = left = ans = 0
for right, value in enumerate(s):
freq[value] += 1
maxima = max(maxima, freq[value])
while (right - left + 1) - maxima > k:
freq[s[left]] -= 1
left += 1
ans = max(ans, right - left + 1)
return ans
"""
์๊ฐ๋ณต์ก๋: O(NlogN)
- ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ํ ๋ฒ ์
๋ฐ์ดํธ: O(logN)
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ ํ ๋ฒ์ฉ ์ ์ง: O(N)
๊ณต๊ฐ๋ณต์ก๋: O(N)
- ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ํฌ๊ธฐ: O(N) (์ํ๋ฒณ 26๊ฐ์ ๋ํด 4N+1 ๋
ธ๋)
[์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ๊ฐ์]
- ๊ฐ ์ํ๋ฒณ(A~Z)์ ๋น๋์๋ฅผ ํํํ๋ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ฅผ ๊ตฌํํจ.
- ๊ฐ ํธ๋ฆฌ ๋
ธ๋๋ ๊ตฌ๊ฐ ๋ด ํ์ฌ ์ํ๋ฒณ ๋น๋ ์ดํฉ๊ณผ ๊ทธ ๊ตฌ๊ฐ ๋ด ์ต๋น๊ฐ(๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ ์ํ๋ฒณ์ ๋น๋)์ ์ ์ฅํจ.
- ์ด์ง ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ฐ ์ํ๋ฒณ ์ธ๋ฑ์ค๋ฅผ ๋ฆฌํ ๋
ธ๋(0~25)์ ๋งคํ.
[ํต์ฌ ๋์ ์ค๋ช
]
- window.update(๋ฌธ์, ยฑ1): ํ์ฌ ์๋์ฐ์ ์ ๋ฌธ์๋ฅผ ์ถ๊ฐ/์ ๊ฑฐํ ๋ ํด๋น ์ํ๋ฒณ์ ๋น๋์๋ฅผ O(logN)์ ๊ฐฑ์ .
- window.tree[1][0]: ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ๋ฃจํธ์ ์ฒซ ๋ฒ์งธ ๊ฐ์ผ๋ก, ํ์ฌ ์๋์ฐ ๋ด ์ ์ฒด ๋ฌธ์ ๊ฐ์(์๋์ฐ ๊ธธ์ด)๋ฅผ ์๋ฏธ.
- window.tree[1][1]: ๋ฃจํธ์ ๋ ๋ฒ์งธ ๊ฐ์ผ๋ก, ํ์ฌ ์๋์ฐ ๋ด์์ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ ๋ฌธ์์ ๋ฑ์ฅ ํ์๋ฅผ ์๋ฏธ.
- (์๋์ฐ ์ ์ฒด๊ธธ์ด - ์ต๋น๊ฐ) > k ๋ฅผ ๋ง์กฑํ ๋๊น์ง ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ฎ๊ธฐ๋ฉฐ(=์ผ์ชฝ ๋ฌธ์ ์ ๊ฑฐ), ์๋์ฐ๊ฐ k๊ฐ ์ดํ์ ๋ฌธ์๋ง ๋ฐ๊พธ๋ฉด ๋ชจ๋ ๋์ผํ๊ฒ ๋ง๋ค ์ ์๋ ๋ฒ์๋ก ์ถ์.
- ๋งค ๋ฐ๋ณต๋ง๋ค ans๋ฅผ ์ต๋ ์๋์ฐ ํฌ๊ธฐ๋ก ๊ฐฑ์ .
โป ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ์ฌ์ฉ์ ์ด ๋ฌธ์ ์ ์ต์ ํด๋ ์๋๋, ์๋ฃ๊ตฌ์กฐ ํ์ต์๋ ์ข์ ์ฐ์ต ์์ .
"""
class SegTree:
def __init__(self):
# summation, largest
self.tree = [[0, 0] for _ in range(26 * 4 + 1)]
def _update(
self,
node_index: int,
target_index: int,
target_update: int,
seg_left: int,
seg_right: int,
):
if seg_left == seg_right:
self.tree[node_index][0] += target_update
self.tree[node_index][1] += target_update
return
mid = (seg_left + seg_right) // 2
if target_index <= mid:
self._update(node_index * 2, target_index, target_update, seg_left, mid)
else:
self._update(
node_index * 2 + 1, target_index, target_update, mid + 1, seg_right
)
self.tree[node_index][0] = (
self.tree[node_index * 2][0] + self.tree[node_index * 2 + 1][0]
)
self.tree[node_index][1] = max(
self.tree[node_index * 2][1], self.tree[node_index * 2 + 1][1]
)
def update(self, target: str, update: int):
self._update(1, ord(target) - ord("A"), update, 0, 25)
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
left = 0
window = SegTree()
ans = 0
for right, value in enumerate(s):
window.update(value, 1)
while window.tree[1][0] - window.tree[1][1] > k:
window.update(s[left], -1)
left += 1
ans = max(ans, right - left + 1)
return ans- ํจํด: Sliding Window, Hash Map / Hash Set, Dynamic Programming
- ์ค๋ช : ์ฒซ ๋ฒ์งธ ์ฝ๋์์ ์๋์ฐ ํฌ๊ธฐ๋ฅผ ๋ณ๋์ํค๋ฉฐ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต๋ ๊ธธ์ด๋ฅผ ์ฐพ๋ Sliding Window ํจํด์ด๋ค. freq๋ก ๋ฌธ์ ๋น๋๋ฅผ ์ถ์ ํ๋ ํด์ ๋งต/ํด์์ ์ผ๋ก ๊ตฌํ๋ ํต์ฌ ์์ด๋์ด๋ฅผ ์ฌ์ฉํ๋ค. ๋ ๋ฒ์งธ ์ฝ๋๋ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ก ์๋์ฐ ๋ด ์ดํฉ๊ณผ ์ต๋น๊ฐ์ ๊ด๋ฆฌํ๋, ์๋์ฐ๋ฅผ ์ข์ฐ๋ก ํ์ฅ/์ถ์ํ๋ ํ๋ฆ์ Sliding Window์ ํ์ฅ์ผ๋ก ๋ณผ ์ ์๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
โน๏ธ ์ด ํ์ผ์๋ 2๊ฐ์ง ํ์ด๊ฐ ํฌํจ๋์ด ์์ด ๊ฐ๊ฐ ๋ถ์ํฉ๋๋ค.
ํ์ด 1: Solution.characterReplacement โ Time: O(n) / Space: O(1)
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๋จ์ผ ๋ฃจํ์ ์์ ๊ฐ์ ์ถ๊ฐ ๋ณ์๋ก ๊ตฌ์ฑ๋์ด ์๊ฐ๋ณต์ก๋๋ ์ ํ์ด๋ฉฐ, ๊ณต๊ฐ์ ๊ณ ์ ๋ ์์ ํฌ๊ธฐ์ ๋ณ์๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
ํ์ด 2: SegTree.characterReplacement โ Time: O(n log N) / Space: O(N)
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n log N) |
| Space | O(N) |
ํผ๋๋ฐฑ: ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ก ๊ตฌํํ์ง๋ง ๋ฌธ์ ์ ์ต์ ํด๋ ์๋ ์ ์์ผ๋ฉฐ, ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ๊ฐ๋จํ ๊ตฌํ์ ๋นํด ๋นํจ์จ์ ์ผ ์ ์๋ค. ํธ๋ฆฌ ์ ๋ฐ์ดํธ๊ฐ ๋งค ๋ฌธ์๋ง๋ค ํ์ํ๋ค.
๊ฐ์ ์ ์: ๊ณ ๋ คํด๋ณผ ๋งํ ๋์: ๊ฐ๋จํ ํด์๋งต+์๋์ฐ ๋ฐฉ์์ผ๋ก O(n) ์๊ฐ๊ณผ O(1) ๊ณต๊ฐ์ ๋ ๊ฐ๊น์ด ๊ตฌํ์ ์ฐ์ ์๋ํด๋ณผ ๊ฒ.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
|
์ด๋ฒ ์ฃผ์ฐจ์ ์๊ด์๋ ์ปค๋ฐ ๋ก๊ทธ๋ ์ ๋ฆฌ ๋ถํ๋๋ฆฝ๋๋ค. |
|
|
||
| """ | ||
| ์๊ฐ๋ณต์ก๋: O(NlogN) | ||
| - ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ํ ๋ฒ ์ ๋ฐ์ดํธ: O(logN) |
There was a problem hiding this comment.
์ด๊ฑฐ ์์๋ผ 1์ด๋ค์, O(N)์ด ์๊ฐ๋ณต์ก๋์ ๋๋ค.
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
longest-common-subsequence/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋ : O(T1 * T2)
๊ณต๊ฐ๋ณต์ก๋ : O(T1) # T1์ ์งง์ ๋ฌธ์์ด์ ์ค์ ํ๊ธฐ์ ๊ณต๊ฐ๋ณต์ก๋๋ T1์ด ๋๋ค.
1. text1๊ณผ text2 ์ค ๋ ์งง์ ์ชฝ์ text1์ผ๋ก ์ค์ ํ๋ค.
2. T1๊ณผ T2๋ฅผ ๊ฐ๊ฐ text1๊ณผ text2์ ๊ธธ์ด๋ก ์ค์ ํ๋ค.
3. dp ๋ฐฐ์ด์ T1 + 1 ํฌ๊ธฐ๋ก 0์ผ๋ก ์ด๊ธฐํํ๋ค.
4. text2์ ๊ฐ ๋ฌธ์(i)๋ฅผ ์ํํ๋ฉด์ ๋น๊ตํ๋ค.
5. new_dp ๋ฐฐ์ด์ T1 + 1 ํฌ๊ธฐ๋ก 0์ผ๋ก ์ด๊ธฐํํ๋ค.
6. text1์ ๊ฐ ๋ฌธ์(j)์ ๋ํด ์ํํ๋ฉด์ ๋น๊ตํ๋ค.
7. text2[i - 1]๊ณผ text1[j - 1]๊ฐ ๊ฐ์ผ๋ฉด, new_dp[j]๋ฅผ dp[j - 1] + 1๋ก ์ค์ ํ๋ค.
8. ๋ค๋ฅด๋ฉด, new_dp[j]๋ฅผ max(new_dp[j - 1], dp[j])๋ก ์ค์ ํ๋ค.
9. dp๋ฅผ new_dp๋ก ๊ฐฑ์ ํ๊ณ , ๋ง์ง๋ง ์์๋ฅผ ๋ฐํํ๋ค.
"""
class Solution:
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
if len(text1) > len(text2):
text1, text2 = text2, text1
T1, T2 = len(text1), len(text2)
dp = [0] * (T1 + 1)
for i in range(1, T2 + 1):
new_dp = [0] * (T1 + 1)
for j in range(1, T1 + 1):
if text2[i - 1] == text1[j - 1]:
new_dp[j] = dp[j - 1] + 1
else:
new_dp[j] = max(new_dp[j - 1], dp[j])
dp = new_dp
return dp[-1]- ํจํด: Dynamic Programming, Two Pointers
- ์ค๋ช : ๋ ๋ฌธ์์ด์ LCS๋ฅผ ๊ตฌํ๊ธฐ ์ํด ๋ถ๋ถ๋ฌธ์ ์ ํด๋ฅผ ์ด์ฉํด ์์ฐจ์ ์ผ๋ก dp๋ฅผ ๊ฐฑ์ ํ๋ ์ ํ์ ์ธ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ํจํด์ด๋ฉฐ, ๊ณต๊ฐ ์ ์ฝ์ ์ํด ํ์ฌ์ ์ด์ ํ๋ง ์ฌ์ฉํ๋ ์ ์์ ์ ์ง์ ๊ฐฑ์ ์ด ํต์ฌ์ด๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(T1 * T2) |
| Space | O(T1) |
ํผ๋๋ฐฑ: ๋ ๋ฌธ์์ด ๊ธธ์ด์ ๋น๋กํ๋ ์ด์ค ๋ฃจํ์ ํ ์ค์ ๋ณด์กฐ ๋ฐฐ์ด ์ฌ์ฉ์ผ๋ก ๊ณต๊ฐ์ ์ต์ ํํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
๋ต์ ์ ์ถ ๋ฌธ์
์์ฑ์ ์ฒดํฌ ๋ฆฌ์คํธ
In Review๋ก ์ค์ ํด์ฃผ์ธ์.๊ฒํ ์ ์ฒดํฌ ๋ฆฌ์คํธ
Important
๋ณธ์ธ ๋ต์ ์ ์ถ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ถ PR ํ๋ ์ด์์ ๋ฐ๋์ ๊ฒํ ๋ฅผ ํด์ฃผ์ ์ผ ํฉ๋๋ค!