[alphaorderly] WEEK 11 Solutions - #2846
Conversation
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
binary-tree-maximum-path-sum/alphaorderly.py
# 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
"""
์๊ฐ๋ณต์ก๋: O(n)
๊ณต๊ฐ๋ณต์ก๋: O(n)
"""
class Solution:
def maxPathSum(self, root: Optional[TreeNode]) -> int:
def calc(node: Optional[TreeNode]):
if not node:
# (ํ์ชฝ ์๋ธํธ๋ฆฌ์์ root๋ฅผ ํฅํด ์ฌ๋ผ์ค๋ ๊ฒฝ๋ก์ ์ต๋ํฉ,
# ํด๋น ์๋ธํธ๋ฆฌ ๋ด ์์ ๊ฒฝ๋ก์ ์ต๋ ํฉ)
return (-float("inf"), -float("inf"))
# ์ผ์ชฝ ์๋ธํธ๋ฆฌ ๊ฒฐ๊ณผ
# left: ์ผ์ชฝ ์์์ผ๋ก๋ถํฐ root๋ฅผ ํฅํด ์ด์ด์ง ์ ์๋ ๋จ์ผ ๊ฒฝ๋ก์ ์ต๋ ํฉ
# left_root: ์ผ์ชฝ ์๋ธํธ๋ฆฌ ์ ์ฒด์์ ์ป์ ์ ์๋ ์์ ๊ฒฝ๋ก์ ์ต๋ ํฉ
left, left_root = calc(node.left)
# ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ๊ฒฐ๊ณผ
# right: ์ค๋ฅธ์ชฝ ์์์ผ๋ก๋ถํฐ root๋ฅผ ํฅํด ์ด์ด์ง ์ ์๋ ๋จ์ผ ๊ฒฝ๋ก์ ์ต๋ ํฉ
# right_root: ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ์ ์ฒด์์ ์ป์ ์ ์๋ ์์ ๊ฒฝ๋ก์ ์ต๋ ํฉ
right, right_root = calc(node.right)
# ํ์ชฝ(์ผ์ชฝ/์ค๋ฅธ์ชฝ) ๋๋ ์๋ฌด์ชฝ๋ ์ํ๊ฑฐ๋(0) ํ์ฌ๋
ธ๋๋ก ์ฐ๊ฒฐ ๊ฐ๋ฅ, ๋จ์ผ ๊ฒฝ๋ก ์ต๋ ํฉ
current = max(left, right, 0) + node.val
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฃจํธ๋ก ํ๋ ์๋ธํธ๋ฆฌ์์ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ๋ก ์ค ์ต๋ ํฉ (๊ฐ ์์ 0 ๋ฏธ๋ง์ด๋ฉด ์ํ)
current_root = max(max(left, 0) + max(right, 0) + node.val, left_root, right_root)
return (current, current_root)
_, ans = calc(root)
return ans- ํจํด: Binary Search, Tree DP, DFS, Dynamic Programming
- ์ค๋ช : ํธ๋ฆฌ์ ๊ฐ ๋ ธ๋์์ ์ผ์ชฝ/์ค๋ฅธ์ชฝ ๋ถ๋ถํธ๋ฆฌ ์ ๋ณด๋ฅผ ์กฐํฉํด ๊ฒฝ๋ก์ ์ต๋ ํฉ์ ๊ตฌํ๋ ๋ฐฉ์์ ํธ๋ฆฌ ๊ธฐ๋ฐ DP(Tree DP)์ DFS๋ฅผ ํ์ฉํ ํจํด์ ๋๋ค. ์ฌ๊ท์ ์ผ๋ก ํ์ ์ ๋ณด๋ฅผ ๊ณ์ฐํ๊ณ ์ด๋ฅผ ํฉ์ณ ์ต๋๊ฐ์ ๋์ถํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(n) |
ํผ๋๋ฐฑ: ๊ฐ ๋ ธ๋์์ ์ข์ฐ ์๋ธํธ๋ฆฌ์ ์ ๋ณด๋ฅผ ์กฐํฉํด ์ ์ฒด ๊ฒฝ๋ก ์ต๋์น๋ฅผ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ผ๋ก ํธ๋ฆฌ ์ ์ฒด๋ฅผ ํ ๋ฒ ํ์ํฉ๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
graph-valid-tree/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(n)
๊ณต๊ฐ๋ณต์ก๋: O(n)
๋จผ์ ํธ๋ฆฌ์ ์กฐ๊ฑด์ ๋ง๋๋ก ๊ฐ์ ์ ๊ฐฏ์๊ฐ ๋
ธ๋์ ๊ฐฏ์ - 1์ธ์ง ํ์ธํ๊ณ
Union-Find ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ํ๋์ฉ ์ถ๊ฐํ๋ฉฐ ์ฌ์ดํด ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
"""
class UnionFind:
def __init__(self, n: int):
self.parent = [-1] * n
self.rank = [0] * n
def find(self, target: int) -> int:
if self.parent[target] == -1:
return target
self.parent[target] = self.find(self.parent[target])
return self.parent[target]
def union(self, a: int, b: int) -> bool:
a = self.find(a)
b = self.find(b)
if a == b:
return False
if self.rank[a] < self.rank[b]:
a, b = b, a
self.parent[b] = a
if self.rank[a] == self.rank[b]:
self.rank[a] += 1
return True
class Solution:
def validTree(self, n: int, edges: List[List[int]]) -> bool:
if len(edges) < n - 1:
return False
u = UnionFind(n)
for a, b in edges:
if not u.union(a, b):
return False
return True- ํจํด: Union Find
- ์ค๋ช : ์ฃผ์ด์ง ๊ทธ๋ํ๊ฐ ํธ๋ฆฌ์ธ์ง ํ์ธํ๊ธฐ ์ํด Union-Find๋ก ์ฌ์ดํด ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๊ณ , ๊ฐ์ ๊ฐ์๊ฐ ๋ ธ๋ ์์ -1์ธ์ง ํ์ธํ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ดํ๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(n) |
ํผ๋๋ฐฑ: ์ด๊ธฐ ๊ฐ์ ๊ฐ์ ํ์ธ์ผ๋ก ๋น ๋ฅด๊ฒ ๊ฑฐ์ง ์์ฑ์ ๊ฑธ๋ฌ๋ด๊ณ , ๊ฐ ๊ฐ์ ๋ง๋ค ์ฌ์ดํด ์ฌ๋ถ๋ฅผ ์ฒดํฌํฉ๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
๐ alphaorderly ๋์ ํ์ต ํํฉ์ด๋ฒ ์ฃผ ์ ์ถ ๋ฌธ์
๋์ ํ์ต ์์ฝ
๋ฌธ์ ํ์ด ํํฉ
๐ค ์ด ๋๊ธ์ GitHub App์ ํตํด ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค. ๐ข API ์ฌ์ฉ๋ (gpt-5-nano)
|
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
merge-intervals/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(n log n)
๊ณต๊ฐ๋ณต์ก๋: O(n)
1. ์ธํฐ๋ฒ์ ์์์๊ฐ์ด ์ด๋ฅธ ์์๋๋ก ์ ๋ ฌํ๋ค.
2. ์ฒซ ๋ฒ์งธ ์ธํฐ๋ฒ์ ์์์๊ฐ๊ณผ ์ข
๋ฃ์๊ฐ์ผ๋ก ์ค์ ํ๋ค.
3. ๋ ๋ฒ์งธ ์ธํฐ๋ฒ๋ถํฐ ์์์๊ฐ์ด ์ด์ ์ธํฐ๋ฒ์ ์ข
๋ฃ์๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ ์ข
๋ฃ์๊ฐ์ ์ต๋๊ฐ์ผ๋ก ์
๋ฐ์ดํธํ๋ค.
4. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ด์ ์ธํฐ๋ฒ์ ๊ฒฐ๊ณผ์ ์ถ๊ฐํ๊ณ ํ์ฌ ์ธํฐ๋ฒ์ ์์์๊ฐ๊ณผ ์ข
๋ฃ์๊ฐ์ผ๋ก ์ค์ ํ๋ค.
5. ๋ง์ง๋ง ์ธํฐ๋ฒ์ ๊ฒฐ๊ณผ์ ์ถ๊ฐํ๋ค.
"""
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort()
N = len(intervals)
schedule = []
start, end = intervals[0]
for i in range(1, N):
event_start, event_end = intervals[i]
if event_start <= end:
end = max(end, event_end)
else:
schedule.append([start, end])
start = event_start
end = event_end
schedule.append([start, end])
return schedule- ํจํด: Sort, Two Pointers, Greedy
- ์ค๋ช : ๊ตฌํ์ ๊ฐ๊ฒฉ์ ์์์ ๊ธฐ์ค ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๋ค, ์ธ์ ๊ตฌ๊ฐ์ ๋น๊ตํ๋ฉฐ ๊ฒน์น๋ฉด ๋์ ์ ํ์ฅํ๊ณ , ๊ฒน์น์ง ์์ผ๋ฉด ๊ฒฐ๊ณผ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์ต์ ๋ถํ ์ ์ํํ๋ค. ์ด ๊ณผ์ ์์ ์ ํ ํ์๊ณผ ์ ๋ ฌ์ ๊ฒฐํฉํ ๊ทธ๋ฆฌ๋ ํจํด์ผ๋ก ํด์๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n log n) |
| Space | O(n) |
ํผ๋๋ฐฑ: ์ ๋ ฌ๊ณผ ๋จ์ผ ์ํ๋ก ๋ณํฉ์ ์ํํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ ์ ๋ ฌ์ ์์กดํฉ๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
missing-number/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(n)
๊ณต๊ฐ๋ณต์ก๋: O(1)
'target'์ ๋ฐฐ์ด์ ๊ธธ์ด(n)๋ก ์ค์ ํ ๋ค, 0๋ถํฐ n-1๊น์ง์ ์ธ๋ฑ์ค์ ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ์ xor ์ฐ์ฐํฉ๋๋ค.
์ด ๊ณผ์ ์ ๊ฑฐ์น๋ฉด, ๋ฐฐ์ด๊ณผ ์ธ๋ฑ์ค ๋ชจ๋์ ์กด์ฌํ๋ ๊ฐ์ xor ์ฐ์ฐ์ผ๋ก ์๊ฑฐ๋์ด ์ฌ๋ผ์ง๋๋ค(x ^ x = 0).
์ต์ข
์ ์ผ๋ก ๋จ๋ ๊ฐ์ด ๋ฐฐ์ด์ ์กด์ฌํ์ง ์๋ ๋๋ฝ๋ ์ซ์๊ฐ ๋ฉ๋๋ค.
"""
class Solution:
def missingNumber(self, nums: List[int]) -> int:
target = len(nums)
for i, v in enumerate(nums):
target ^= i ^ v
return target- ํจํด: Bit Manipulation, Two Pointers
- ์ค๋ช : XOR ์ฐ์ฐ์ผ๋ก ์ธ๋ฑ์ค์ ๊ฐ์ ์ฐจ์งํฉ์ ์ ๊ฑฐํ์ฌ missing number๋ฅผ ์ฐพ๋ ๋ฐฉ์์ ๋นํธ ์กฐ์(Bit Manipulation) ํจํด์ ํด๋นํฉ๋๋ค. ๋ฌธ์ ์ ํด๋ฒ์ ์ฌ๋ฌ ์์๋ฅผ ๋์์ ๊ฒฐํฉํด ํ ๊ฐ๋ง ๋จ๊ธฐ๋ ์ ํ์ ์ธ XOR ๊ธฐ๋ฐ ์ ๊ทผ์ผ๋ก ์ค๋ช ๋ฉ๋๋ค. Two Pointers ํจํด์ ์ฌ์ฉ๋์ง ์์ง๋ง, ๋ฐฐ์ด ์ํ์ ๋๋ฝ ์์ ์ฐพ๊ธฐ๋ผ๋ ๋งฅ๋ฝ์์ Bit Manipulation์ด ํต์ฌ์ ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๋ฐฐ์ด ์์์ ์ธ๋ฑ์ค์ XOR์ ์ด์ฉํด ๋๋ฝ๋ ๊ฐ์ ๊ตฌํฉ๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
reorder-list/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(n)
๊ณต๊ฐ๋ณต์ก๋: O(1)
1. ํ ๋ผ์ ๊ฑฐ๋ถ์ด ํฌ์ธํฐ๋ฅผ ์ด์ฉํด ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ค๊ฐ ์ง์ ์ ์ฐพ๋๋ค.
2. ์ค๊ฐ ์ง์ ๋ถํฐ ๋๊น์ง์ ๋ฆฌ์คํธ๋ฅผ ์ญ์์ผ๋ก ๋ค์ง๋๋ค.
- ์ด ๊ณผ์ ์์ ์๋ถ๋ถ๊ณผ ๋ท๋ถ๋ถ์ด ๋ถ๋ฆฌ๋๋ค.
3. ์๋ถ๋ถ(head)๊ณผ ๋ค์งํ ๋ท๋ถ๋ถ์ ๊ต์ฐจ๋ก ์ฐ๊ฒฐํ์ฌ ์์๋ฅผ ์ฌ๋ฐฐ์ดํ๋ค.
"""
class Solution:
def reorderList(self, head: Optional[ListNode]) -> None:
"""
Do not return anything, modify head in-place instead.
"""
tortoise = hare = head
while hare and hare.next:
tortoise = tortoise.next
hare = hare.next.next
prev, curr = None, tortoise
while curr:
curr.next, prev, curr = prev, curr, curr.next
a, b = head, prev
while b.next:
a.next, a = b, a.next
b.next, b = a, b.next- ํจํด: Two Pointers, Reorder List
- ์ค๋ช : ์ค๊ฐ ์ง์ ์ฐพ๊ธฐ์ ํ ๋ผ-๊ฑฐ๋ถ์ด ํฌ์ธํฐ๋ก Two Pointers๋ฅผ ์ด์ฉํ๊ณ , ๋ค์ชฝ ๋ถ๋ถ์ ์ญ์์ผ๋ก ๋ค์ง์ด ์๋ถ๋ถ๊ณผ ๊ต์ฐจ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ์ฌ๋ฐฐ์ดํ๋ ํจํด์ด ๋ณด์ ๋๋ค. ์ ์ฒด ํ๋ฆ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ์์ฐจ์ ์กฐ์๊ณผ ๋ถ๋ถ์งํฉ ์ฌ๊ตฌ์ฑ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๋ ๋ฒ์ ์ ํ ์ํ๋ฅผ ํตํด in-place ์ฌ๋ฐฐ์ด์ ๋ฌ์ฑํฉ๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
missing-number/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(n)
๊ณต๊ฐ๋ณต์ก๋: O(1)
'target'์ ๋ฐฐ์ด์ ๊ธธ์ด(n)๋ก ์ค์ ํ ๋ค, 0๋ถํฐ n-1๊น์ง์ ์ธ๋ฑ์ค์ ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ์ xor ์ฐ์ฐํฉ๋๋ค.
์ด ๊ณผ์ ์ ๊ฑฐ์น๋ฉด, ๋ฐฐ์ด๊ณผ ์ธ๋ฑ์ค ๋ชจ๋์ ์กด์ฌํ๋ ๊ฐ์ xor ์ฐ์ฐ์ผ๋ก ์๊ฑฐ๋์ด ์ฌ๋ผ์ง๋๋ค(x ^ x = 0).
์ต์ข
์ ์ผ๋ก ๋จ๋ ๊ฐ์ด ๋ฐฐ์ด์ ์กด์ฌํ์ง ์๋ ๋๋ฝ๋ ์ซ์๊ฐ ๋ฉ๋๋ค.
"""
class Solution:
def missingNumber(self, nums: List[int]) -> int:
target = len(nums)
for i, v in enumerate(nums):
target ^= i ^ v
return target- ํจํด: Bit Manipulation
- ์ค๋ช : ๋ฐฐ์ด ์์์ ์ธ๋ฑ์ค์ ๊ฐ์ XOR๋ก ์๊ฑฐํ๋ ๋ฐฉ์์ผ๋ก ๋๋ฝ๋ ์ซ์๋ฅผ ์ฐพ๋ ๋นํธ ์ฐ์ฐ ํจํด์ ๋๋ค. ๋ฆฌ์คํธ์ ๊ธธ์ด๋ฅผ ๋์์ผ๋ก ํ์ฌ ๋ชจ๋ ์ธ๋ฑ์ค์ ๊ฐ๊ณผ์ XOR๋ฅผ ๋์ ํ๋ฉด ๋จ์ ๊ฐ์ด ์ ๋ต์ด ๋ฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๋ชจ๋ ์์์ ์ธ๋ฑ์ค ๊ฐ์ ์ํํ๋ฉฐ XOR ์ฐ์ฐ์ผ๋ก ๋์ผํ ๊ฐ์ ์๊ฑฐํ๋ฏ๋ก ๋๋ฝ๋ ๊ฐ์ด ์ต์ข ์ ์ผ๋ก ๋จ์ต๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
๋ต์ ์ ์ถ ๋ฌธ์
์์ฑ์ ์ฒดํฌ ๋ฆฌ์คํธ
In Review๋ก ์ค์ ํด์ฃผ์ธ์.๊ฒํ ์ ์ฒดํฌ ๋ฆฌ์คํธ
Important
๋ณธ์ธ ๋ต์ ์ ์ถ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ถ PR ํ๋ ์ด์์ ๋ฐ๋์ ๊ฒํ ๋ฅผ ํด์ฃผ์ ์ผ ํฉ๋๋ค!