[yuseok89] WEEK 11 Solutions - #2848
Conversation
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
binary-tree-maximum-path-sum/yuseok89.py
# TC: O(N)
# SC: O(1)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxPathSum(self, root: Optional[TreeNode]) -> int:
ans = float('-inf')
def get_max(cur: Optional[TreeNode]) -> int:
nonlocal ans
if cur is None:
return 0
left_max = get_max(cur.left)
right_max = get_max(cur.right)
ans = max(ans, cur.val, cur.val + left_max, cur.val + right_max, cur.val +left_max + right_max)
return max(cur.val, cur.val + max(left_max, right_max))
get_max(root)
return ans
- ํจํด: Depth-First Search, Dynamic Programming, Binary Search
- ์ค๋ช : ํธ๋ฆฌ์ ๊ฐ ๋ ธ๋์์ ์ข์ฐ ์์์ ์ต๋ ํฉ์ ์ฌ๊ท์ ์ผ๋ก ๊ณ์ฐํ๋ฉฐ, ๊ธ๋ก๋ฒ ์ต๋๊ฐ์ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ DFS๋ก ํธ๋ฆฌ๋ฅผ ์ํํ๊ณ , ๊ฐ ๋ ธ๋์ ์ ๋ณด๋ฅผ ์ฌํ์ฉํด ์ต๋๊ฐ์ ๋์ ํ๋ DP์ ํจํด๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค. ๋ํ ๋ถ๋ถํด๋ฅผ ํฉ์ผ๋ก ๊ณ ๋ คํ๋ ๊ตฌ์กฐ๋ ํธ๋ฆฌ์์์ ์ต์ ํด ๊ตฌ์ฑ์ DP ์ฑ์ง์ ๋ฐ์ํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(N) | O(n) | โ |
| Space | O(1) | O(h) | โ |
ํผ๋๋ฐฑ: ๊ฐ ๋ ธ๋์์ ์ผ์ชฝ/์ค๋ฅธ์ชฝ ์์์์์ ์ต๋ ์ฆ๊ฐ๋ถ์ ๊ตฌํ๊ณ , ์ด๋ฅผ ์ด์ฉํด ํ์ฌ ๋ ธ๋๋ฅผ ํฌํจํ ๊ฒฝ๋ก์ ์ต๋ ํฉ๊ณผ ๋ฆฌํด ๊ฐ์ ๊ณ์ฐํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ ์ ํ์ ์ธ DFS ๋ฐฉ์์ผ๋ก ๋์ํ๋ฉฐ, ๊ณต๊ฐ ๋ณต์ก๋๋ ์ฌ๊ท ํธ์ถ ๊น์ด์ ๋ฐ๋ผ ์ข์ฐ ๊น์ด์ ํฉ ์ค ์ต๋๊ฐ์ธ h์ ๋น๋กํ๋ค. ํ์ ์ ์ํ ๋ฐฉ์์ผ๋ก์ ๋ณํ์ด๋ tail recursion ์ต์ ํ๋ฅผ ๊ณ ๋ คํด๋ ๋๋ค.
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
merge-intervals/yuseok89.py
# TC: O(NlogN)
# SC: O(N)
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
ans = list()
intervals.sort(key=lambda x:x[0])
ans.append([intervals[0][0]])
end = intervals[0][1]
for idx in range(1, len(intervals)):
if intervals[idx][0] <= end:
end = max(end, intervals[idx][1])
else:
ans[-1].append(end)
ans.append([intervals[idx][0]])
end = intervals[idx][1]
ans[-1].append(end)
return ans
- ํจํด: Greedy, Sort
- ์ค๋ช : Intervals ์ ๋ ฌ ํ ๊ฒน์น๋ ๊ตฌ๊ฐ์ ํ๋์ ๊ตฌ๊ฐ์ผ๋ก ํฉ์น๋ ๊ณผ์ ์ ์ฌ์ฉํ๋ฏ๋ก Greedy ํจํด์ผ๋ก ๋ถ๋ฅ๋๋ฉฐ, ๋จผ์ ์์์ ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ์ ๋ต์ด ํต์ฌ์ ๋๋ค. ๋ํ ํฌํฌ์ธํฐ์ฒ๋ผ ํ์ฌ ๊ตฌ๊ฐ์ ๋๊ณผ ๋ค์ ๊ตฌ๊ฐ์ ์์์ ๋น๊ตํด ํ์ฅ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(NlogN) | O(n log n) | โ |
| Space | O(N) | O(n) | โ |
ํผ๋๋ฐฑ: ์ ๋ ฌ๊ณผ ์ ํ ์ํ๋ก ๊ฒน์น๋ ๊ตฌ๊ฐ๋ค์ ํฉ์น๋ค. ์์์ ์ ๋ ฌ์ด ํต์ฌ์ด๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ ๊ธฐ๋ณธ์ ์ธ ํ์ด๋ก ์ ์ ํ๋ค. ํ์ ์ ์์ธ ์ฒ๋ฆฌ๋ ๋น์ด์๋ ์ ๋ ฅ์ ๋ํ ๋ฐฉ์ด ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
๐ yuseok89 ๋์ ํ์ต ํํฉ์ด๋ฒ ์ฃผ ์ ์ถ ๋ฌธ์
๋์ ํ์ต ์์ฝ
๋ฌธ์ ํ์ด ํํฉ
๐ค ์ด ๋๊ธ์ GitHub App์ ํตํด ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค. ๐ข API ์ฌ์ฉ๋ (gpt-5-nano)
|
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
missing-number/yuseok89.py
# TC: O(N)
# SC: O(1)
class Solution:
def missingNumber(self, nums: List[int]) -> int:
n = len(nums)
total = n * (n + 1) // 2
for num in nums:
total -= num
return total
- ํจํด: Greedy, Bit Manipulation, Dynamic Programming, Hash Map / Hash Set, Divide and Conquer, Two Pointers, Sliding Window, Backtracking, DFS, BFS, Union Find, Trie, Heap / Priority Queue, Monotonic Stack, Binary Search
- ์ค๋ช : ํด๋น ์ฝ๋๋ ์์ ํฉ ๊ณต์์ ์ด์ฉํด ๋๋ฝ๋ ์ซ์๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ์ ์ฒด ํฉ์์ ๋ฐฐ์ด ๊ฐ๋ค์ ์ฐจ๊ฐํ๋ ์์ด๋์ด๋ฅผ ์ฌ์ฉํ๋ค. ๋ฌธ์ ์ ์๊ฐ๋ณต์ก๋๋ O(N), ๊ณต๊ฐ๋ณต์ก๋๋ O(1)๋ก ๊ตฌํ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(N) | O(n) | โ |
| Space | O(1) | O(1) | โ |
ํผ๋๋ฐฑ: ๋ฑ์ฐจ์์ด์ ํฉ ๊ณต์์ ์ด์ฉํด ํ ๋ฒ์ ์ํ๋ก ๋๋ฝ ์ซ์๋ฅผ ๊ตฌํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ๊ฐ๋จํ๊ณ ํจ์จ์ ์ด๋ค. ์ ๋ ฅ์ ๋น ๋ฐฐ์ด ๋ฑ์ ํน์ ์ผ์ด์ค๋ฅผ ๊ฐ์ ํ์ง ์๋๋ค๋ฉด ์ถ๊ฐ ๋ฐฉ์ด๊ฐ ํ์ํ ์ ์๋ค.
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
reorder-list/yuseok89.py
# TC: O(N)
# SC: O(1)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reorderList(self, head: Optional[ListNode]) -> None:
"""
Do not return anything, modify head in-place instead.
"""
if not head or not head.next:
return
def rec(right: Optional[ListNode]) -> Optional[ListNode]:
if not right:
return head
left = rec(right.next)
if not left:
return None
if left == right or left.next == right:
right.next = None
return None
nxt_left = left.next
left.next = right
right.next = nxt_left
return nxt_left
rec(head)
- ํจํด: Recursion, Two Pointers, Linked List
- ์ค๋ช : ์ฌ๊ท๋ฅผ ์ด์ฉํด ๋ฆฌ์คํธ์ ๋์์๋ถํฐ ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์์ง์ด๋ฉฐ ๋ ธ๋๋ฅผ ์ฌ๋ฐฐ์นํ๋ ๋ฐฉ์์ผ๋ก, ๋ ํฌ์ธํฐ๊ฐ ์๋ก ์ธ์ ํ ๋ ์ข ๋ฃ ์กฐ๊ฑด์ ๊ฑธ๊ณ ์ฐ๊ฒฐ์ ์ฌ๊ตฌ์ฑํฉ๋๋ค. ๋ถ๋ถ์ ์ผ๋ก ์ฌ๊ท ๊น์ด๋ฅผ ํตํด ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ ๋ ๋ฐฉํฅ์ผ๋ก ์ํํ๋ฉฐ O(N) ์๊ฐ, O(1) ์ถ๊ฐ ๊ณต๊ฐ ํน์ฑ์ ๊ฐ์ต๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(N) | O(n) | โ |
| Space | O(1) | O(1) | โ |
ํผ๋๋ฐฑ: ์ ํ์ ์ธ ์์ ์ ๋ ฌ/๋ฐ์ดํฐ ๊ตฌ์กฐ ์กฐํฉ์ผ๋ก ์ฌ๋ฐฐ์นํ๋ค. ์ฌ๊ท์ ํฌ์ธํฐ ์กฐ์์ผ๋ก in-place๋ฅผ ๋ฌ์ฑํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ ์ฌ๊ท๋ฅผ ์ด์ฉํด ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ์ํํ๋ฉฐ ์ฌ๋ฐฐ์น๋ฅผ ์๋ํ๋ค. ๊ตฌํ์ ๋ณต์ก๋๊ฐ ๋ค์ ๋์ผ๋ฏ๋ก ๋ฐ๋ณต์ ์ ๊ทผ์ผ๋ก ๋ฆฌํฉํ ๋ง์ ๊ณ ๋ คํด๋ณผ ์ ์๋ค.
There was a problem hiding this comment.
์์ฒญ ๊น๋ํ๊ฒ ํด๊ฒฐํ์ จ๋ค์, ์ ๋ณด๊ณ ๊ฐ๋๋ค!
There was a problem hiding this comment.
๊ตฌํ ์๋นํ ๊น๋ํ๊ฒ ์ ํ์ จ๋ค์
There was a problem hiding this comment.
์์ฐ ์์ฒญ ๊น๋ํ๊ฒ ์ ํธ์ จ๋ค์
dolphinflow86
left a comment
There was a problem hiding this comment.
์๊ณ ๋ง์ผ์ จ์ต๋๋ค!
| @@ -0,0 +1,37 @@ | |||
| # TC: O(N) | |||
| # SC: O(1) | |||
There was a problem hiding this comment.
@yuseok89 ์๊ฑฐ ์ฌ๊ท ํธ์ถ์ธ๋ฐ ๊ณต๊ฐ ๋ณต์ก๋๊ฐ ์ฌ๊ท ํธ์ถ ๊น์ด๋งํผ์ด๋ผ O(N) ๊น์ง ๊น์ด์ง๋๋ค.
ํ๋ฒ ํ์ธํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์์!
There was a problem hiding this comment.
๋ฆฌ๋ทฐ ๊ฐ์ฌํฉ๋๋ค ๐
| @@ -0,0 +1,30 @@ | |||
| # TC: O(N) | |||
| # SC: O(1) | |||
There was a problem hiding this comment.
@yuseok89 ์ฌ๊ธฐ๋ ๊ณต๊ฐ๋ณต์ก๋๊ฐ ์คํ ๊น์ด๋งํผ ๊น์ด์ง๋ ๋ถ๋ถ ํ์ธ ํด ๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค~!
There was a problem hiding this comment.
๊ณต๊ฐ๋ณต์ก๋ ๊ณ์ฐ ํ๋ฉด์ ์ฌ๊ท๋ถ๋ถ์ ์๊พธ ๋นผ๋จน๋ค์.
๋ฆฌ๋ทฐ ๊ฐ์ฌํฉ๋๋ค ๐
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
reorder-list/yuseok89.py
# TC: O(N)
# SC: O(N)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reorderList(self, head: Optional[ListNode]) -> None:
"""
Do not return anything, modify head in-place instead.
"""
if not head or not head.next:
return
def rec(right: Optional[ListNode]) -> Optional[ListNode]:
if not right:
return head
left = rec(right.next)
if not left:
return None
if left == right or left.next == right:
right.next = None
return None
nxt_left = left.next
left.next = right
right.next = nxt_left
return nxt_left
rec(head)
- ํจํด: Two Pointers, Recursion, Linked List
- ์ค๋ช : ์ฌ๊ท๋ฅผ ์ด์ฉํด ๋ฆฌ์คํธ์ ์ข์ธก ๋ ธ๋์ ์ฐ์ธก ๋ ธ๋๋ฅผ ๊ต์ฐจ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก, ์ฌ๊ท ํธ์ถ๋ก ์ข์ธก ํฌ์ธํฐ๋ฅผ ์ป๊ณ ์ข์ฐ๋ฅผ ๋ฒ๊ฐ์ ๋ถ์ฌ ๋ฆฌ์คํธ๋ฅผ ์ฌ๋ฐฐ์นํ๋ค. ์ฐ๊ฒฐ ์์๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ์ฐ์ฐ์ ์์ฐจ์ ์ผ๋ก ์งํ๋๋ฉฐ, ์ฌ๊ท ๊น์ด์ ํฌ์ธํฐ ์กฐ์์ด ํต์ฌ ํฌ์ธํธ๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(N) | O(n) | โ |
| Space | O(N) | O(n) | โ |
ํผ๋๋ฐฑ: ์ฌ๊ท๋ฅผ ์ด์ฉํด ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ๋ ธ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ผ์ชฝ ๋ถ๋ถ๊ณผ ์ฐ๊ฒฐ์ ๊ตฌ์ฑํ๋ค. ์ฌ๊ท ๊น์ด๊ฐ O(n)๊น์ง ์ฆ๊ฐํ๋ฏ๋ก ๊ณต๊ฐ ๋ณต์ก๋๋ ์คํ ๊น์ด์ ์ํด ๊ฒฐ์ ๋๋ค.
๊ฐ์ ์ ์: ๊ณ ๋ คํด๋ณผ ๋งํ ๋์: ์ฌ๊ท ๋์ ๋ ํฌ์ธํฐ(๋น ๋ฅธ/๋๋ฆฐ)๋ก ์ค๊ฐ์ ๋ถ๋ฆฌํ๊ณ , ๋ค์์๋ถํฐ ์ฐ๊ฒฐํ๊ธฐ๋ณด๋ค ๋ฐฐ์ด์ ๋ ธ๋๋ฅผ ๋ชจ์ ์ญ์์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ๊ณต๊ฐ ์ฌ์ฉ์ ์ค์ผ ์ ์๋ค. ๋ํ tail ํฌ์ธํฐ๋ฅผ ์ ์งํด ๋ถํ์ํ ๋ ธ๋ ์ฌํ ๋น ์์ด O(1) ๊ณต๊ฐ์ผ๋ก ๊ตฌํ ๊ฐ๋ฅํ๋ค.
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
binary-tree-maximum-path-sum/yuseok89.py
# TC: O(N)
# SC: O(H)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxPathSum(self, root: Optional[TreeNode]) -> int:
ans = float('-inf')
def get_max(cur: Optional[TreeNode]) -> int:
nonlocal ans
if cur is None:
return 0
left_max = get_max(cur.left)
right_max = get_max(cur.right)
ans = max(ans, cur.val, cur.val + left_max, cur.val + right_max, cur.val +left_max + right_max)
return max(cur.val, cur.val + max(left_max, right_max))
get_max(root)
return ans
- ํจํด: Binary Search, Depth-First Search, Dynamic Programming, Tree Traversal
- ์ค๋ช : ์ฃผ์ด์ง ์ฝ๋๋ ์ด์ง ํธ๋ฆฌ์์ ๋ชจ๋ ๊ฒฝ๋ก์ ํฉ์ ํ์ํ๋ฉฐ, ์์ ๋ ธ๋์ ์ ๋ณด๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํฉ์ฐํด ์ต๋๊ฐ์ ์ ๋ฐ์ดํธํ๋ค. ๊ฐ ๋ ธ๋์์ ์ข์ฐ ์๋ธํธ๋ฆฌ ์ ๋ณด๋ฅผ ํ์ฉํด ์ต๋ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ์์ DFS์ DP์ ํผํฉ ํจํด์ผ๋ก ๋ณผ ์ ์๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(N) | O(n) | โ |
| Space | O(H) | O(h) | โ |
ํผ๋๋ฐฑ: ์ ์ ํ์๊ณผ ์ฌ๊ท๋ฅผ ์ด์ฉํด ์์ ๋ ธ๋์ ์ต๋ ์ฆ๊ฐ ํฉ์ ํฉ์ฐํ๊ณ , ํ์ฌ ๋ ธ๋์์ ํ์ฑ ๊ฐ๋ฅํ ์ต๋ ๊ฒฝ๋ก๋ฅผ ๊ฐฑ์ ํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๋ต์ ์ ์ถ ๋ฌธ์
์์ฑ์ ์ฒดํฌ ๋ฆฌ์คํธ
In Review๋ก ์ค์ ํด์ฃผ์ธ์.๊ฒํ ์ ์ฒดํฌ ๋ฆฌ์คํธ
Important
๋ณธ์ธ ๋ต์ ์ ์ถ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ถ PR ํ๋ ์ด์์ ๋ฐ๋์ ๊ฒํ ๋ฅผ ํด์ฃผ์ ์ผ ํฉ๋๋ค!