Skip to content

Commit 796ade7

Browse files
authored
Merge pull request #536 from haklee/main
[haklee] week 10
2 parents cd10345 + 5c74619 commit 796ade7

File tree

5 files changed

+216
-0
lines changed

5 files changed

+216
-0
lines changed

โ€Žcourse-schedule/haklee.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"""TC: O(node + edge), SC: O(node + edge)
2+
3+
์œ ๋ช…ํ•œ ์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ฏ€๋กœ ์„ค๋ช…์€ ์ƒ๋žตํ•œ๋‹ค.
4+
"""
5+
6+
7+
class Solution:
8+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
9+
# ์œ„์ƒ ์ •๋ ฌ.
10+
11+
# init
12+
adj_list = [[] for _ in range(numCourses)] # SC: O(edge)
13+
in_deg = [0] * numCourses # SC: O(node)
14+
15+
for edge in prerequisites:
16+
adj_list[edge[0]].append(edge[1])
17+
in_deg[edge[1]] += 1
18+
19+
node_to_search = [i for i, v in enumerate(in_deg) if v == 0] # TC: O(node)
20+
sorted_list = []
21+
22+
# process
23+
while node_to_search:
24+
cur = node_to_search.pop() # TC: ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ด O(node)๋งŒํผ ์‹คํ–‰
25+
sorted_list.append(cur)
26+
for node in adj_list[cur]:
27+
in_deg[node] -= 1 # TC: ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ด O(edge)๋งŒํผ ์‹คํ–‰
28+
if in_deg[node] == 0:
29+
node_to_search.append(node)
30+
31+
return len(sorted_list) == numCourses

โ€Žinvert-binary-tree/haklee.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""TC: O(n), SC: O(h)
2+
3+
h๋Š” ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋†’์ด.
4+
n์ด ์ „์ฒด ๋…ธ๋“œ ๊ฐœ์ˆ˜๋ผ๊ณ  ํ• ๋•Œ
5+
- ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ•œ ์ชฝ ์ž์‹ ๋…ธ๋“œ๋งŒ ์ฑ„์›Œ์ง. ์ด ๊ฒฝ์šฐ h = n.
6+
- ์ตœ์„ ์˜ ๊ฒฝ์šฐ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ. h = log(n).
7+
8+
์•„์ด๋””์–ด:
9+
์–‘์ชฝ ์ž์‹ ๋…ธ๋“œ์— ์ ‘๊ทผํ•ด์„œ ์žฌ๊ท€์ ์œผ๋กœ invert๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , ๋‘ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ฐ”๊พผ๋‹ค.
10+
11+
SC:
12+
- ํ˜ธ์ถœ ์Šคํƒ ๊นŠ์ด๋Š” ํŠธ๋ฆฌ์˜ ๊นŠ์ด๊นŒ์ง€ ๊นŠ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, O(h).
13+
14+
TC:
15+
- ๋ชจ๋“  ๋…ธ๋“œ์— ์ ‘๊ทผ. O(n).
16+
"""
17+
18+
19+
# Definition for a binary tree node.
20+
# class TreeNode:
21+
# def __init__(self, val=0, left=None, right=None):
22+
# self.val = val
23+
# self.left = left
24+
# self.right = right
25+
class Solution:
26+
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
27+
def invert(node: Optional[TreeNode]) -> None:
28+
if node is not None:
29+
node.left, node.right = invert(node.right), invert(node.left)
30+
return node
31+
32+
return invert(root)

โ€Žjump-game/haklee.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""TC: O(n), SC: O(1)
2+
3+
n์€ ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด
4+
5+
์•„์ด๋””์–ด:
6+
- ๋์— ์žˆ๋Š” ์•„์ดํ…œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ '์ตœ์†Œ ์–ด๋””๊นŒ์ง€๋Š” ๋„๋‹ฌํ•ด์•ผ ๋ ์นธ๊นŒ์ง€ ์ ํ”„ ๊ฐ€๋Šฅํ•œ์ง€'๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
7+
- example๋“ค๋กœ ์ดํ•ดํ•ด๋ณด์ž. index๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘.
8+
- example 1: [2,3,1,1,4]
9+
- 4๋ฒˆ์งธ ์นธ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์„ฑ๊ณต์ด๋‹ค. reach_at_least ๊ฐ’์„ 4๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
10+
- 3๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 4๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ ์–ด๋„ 3๋ฒˆ ์นธ๊นŒ์ง€ ๊ฐ€๋ฉด ์„ฑ๊ณต์ด๋ฏ€๋กœ
11+
reach_at_least๋ฅผ 3์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
12+
- 2๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 3๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. reach_at_least๋ฅผ 2๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
13+
- 1๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 1+3=4๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ด ์นธ์—์„œ ํ˜„ reach_at_least ๊ฐ’์ธ 2๋ฒˆ์งธ ์นธ๊นŒ์ง€
14+
์ถฉ๋ถ„ํžˆ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ reach_at_least ๊ฐ’์„ 1๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
15+
- 0๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 0+2=2๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ํ˜„ reach_at_least ๊ฐ’์ธ 1๋ฒˆ์งธ ์นธ๊นŒ์ง€ ์ถฉ๋ถ„ํžˆ
16+
๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ reach_at_least ๊ฐ’์„ 0์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
17+
- 0๋ฒˆ์งธ ์นธ์—์„œ ๋ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
18+
- example 2: [3,2,1,0,4]
19+
- 4๋ฒˆ์งธ ์นธ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์„ฑ๊ณต์ด๋‹ค. reach_at_least ๊ฐ’์„ 4๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
20+
- 3๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 3๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํ˜„ reach_at_least ๊ฐ’์ธ 4๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์—†์œผ๋‹ˆ
21+
์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
22+
- 2๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 2+1=3๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ํ˜„ reach_at_least ๊ฐ’์ธ 4๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์—†๊ณ ,
23+
์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
24+
- 1๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 1+2=3๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
25+
- 0๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 0+3=3๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
26+
- reach_at_least ๊ฐ’์ด 0์ด ์•„๋‹ˆ๋‹ค. ์ฆ‰, 0๋ฒˆ์งธ ์นธ์—์„œ๋Š” ๋ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์—†๋‹ค.
27+
28+
SC:
29+
- reach_at_least ๊ฐ’์— ์ธ๋ฑ์Šค ํ•˜๋‚˜๋งŒ ๊ด€๋ฆฌํ•œ๋‹ค. ์ฆ‰, O(1).
30+
31+
TC:
32+
- nums์˜ ๋์—์„œ ๋‘ ๋ฒˆ์งธ ์•„์ดํ…œ๋ถ€ํ„ฐ ์ฒซ ๋ฒˆ์งธ ์•„์ดํ…œ๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด์„œ reach_at_least๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค. O(n).
33+
"""
34+
35+
36+
class Solution:
37+
def canJump(self, nums: List[int]) -> bool:
38+
reach_at_least = len(nums) - 1
39+
40+
for i in range(len(nums) - 2, -1, -1):
41+
if nums[i] + i >= reach_at_least:
42+
reach_at_least = i
43+
44+
return reach_at_least == 0

โ€Žmerge-k-sorted-lists/haklee.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
"""TC: O(n*log(l)), SC: O(l)
2+
3+
l์€ ๋ฆฌ์ŠคํŠธ ๊ฐœ์ˆ˜, n์€ ์ „์ฒด ์•„์ดํ…œ ๊ฐœ์ˆ˜
4+
5+
์•„์ด๋””์–ด:
6+
- ๊ฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ์ผ ์•ž์— ์žˆ๋Š” ๊ฐ’์„ ๋ฝ‘์•„์„œ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ๋Š”๋‹ค.
7+
- ์šฐ์„ ์ˆœ์œ„ ํ์˜ ์ œ์ผ ์•ž์— ์žˆ๋Š” ๊ฐ’์„ ๋ฝ‘์•„์„œ
8+
- ์ด ๊ฐ’์ด ์–ด๋А ๋ฆฌ์ŠคํŠธ์—์„œ ๋‚˜์™”๋Š”์ง€ ํ™•์ธํ•ด์„œ ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ์˜ ์ œ์ผ ์•ž์— ์žˆ๋Š” ๊ฐ’์„ ์ƒˆ๋กœ ๋ฝ‘์•„์„œ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ฑ„์šด๋‹ค.
9+
- ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๋ฝ‘์€ ๊ฐ’์€ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ๋”ํ•œ๋‹ค.
10+
11+
SC:
12+
- ์šฐ์„ ์ˆœ์œ„ ํ์— ์ตœ๋Œ€ list์˜ ๊ฐœ์ˆ˜ ๋งŒํผ์˜ ์•„์ดํ…œ ์กด์žฌ ๊ฐ€๋Šฅ. O(l).
13+
-
14+
15+
TC:
16+
- heap ํฌ๊ธฐ๋Š” ์ตœ๋Œ€ l์ด๋‹ค.
17+
- ์ด heap์— ์•„์ดํ…œ์„ pushํ•˜๊ณ  popํ• ๋•Œ O(log(l)) ์‹œ๊ฐ„ ์†Œ์š”.
18+
- ์œ„์˜ ์‹œํ–‰์„ ์ „์ฒด ์•„์ดํ…œ ๊ฐœ์ˆ˜ ๋งŒํผ ํ•œ๋‹ค.
19+
- ์ข…ํ•ฉํ•˜๋ฉด O(n*log(l))
20+
"""
21+
22+
# Definition for singly-linked list.
23+
# class ListNode:
24+
# def __init__(self, val=0, next=None):
25+
# self.val = val
26+
# self.next = next
27+
28+
from heapq import heappush, heappop
29+
30+
31+
class Solution:
32+
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
33+
heap = []
34+
head = ListNode()
35+
tail = head
36+
37+
# init
38+
for i in range(len(lists)):
39+
if lists[i]:
40+
heappush(heap, (lists[i].val, i))
41+
lists[i] = lists[i].next
42+
43+
# process
44+
while heap:
45+
v, idx = heappop(heap)
46+
47+
# heap ๋‹ค์‹œ ์ฑ„์›Œ๋„ฃ๊ธฐ
48+
if lists[idx]:
49+
heappush(heap, (lists[idx].val, idx))
50+
lists[idx] = lists[idx].next
51+
52+
# ๊ฒฐ๊ณผ๋ฌผ ์ฑ„์›Œ๋„ฃ๊ธฐ
53+
tail.next = ListNode(v)
54+
tail = tail.next
55+
56+
return head.next
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"""TC: O(n), SC: O(1)
2+
3+
n์€ ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด.
4+
5+
์•„์ด๋””์–ด:
6+
- Rotated Sorted Array๋Š” ํŠน์„ฑ์ƒ `๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋‹ค๊ฐ€ -> ๊ฐ‘์ž๊ธฐ ๊ฐ’์ด ํ•œ ๋ฒˆ ๊ฐ์†Œ -> ์ดํ›„ ๋‹ค์‹œ ์ญ‰ ์ฆ๊ฐ€`ํ•œ๋‹ค.
7+
- ์œ„์˜ ๊ด€์ฐฐ์— ๋”ฐ๋ฅด๋ฉด ๊ฐ’์ด ๊ฐ์†Œํ•˜๋Š” `์ ˆ์ `์€ ์ตœ๋Œ€ ํ•œ ๊ตฐ๋ฐ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
8+
- rotate ์‹œํ–‰์„ 0๋ฒˆ ํ•œ ๊ฒฝ์šฐ ์ ˆ์ ์ด ์—†์Œ. ๊ทธ ์™ธ์—๋Š” ์ ˆ์ ์ด ํ•œ ๋ฒˆ ์ƒ๊น€.
9+
- ์ฆ‰, ๋ฆฌ์ŠคํŠธ์—์„œ ๋‘ ๊ตฌ๊ฐ„์„ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ์žก์œผ๋ฉด ์ด ๋‘ ๊ตฌ๊ฐ„ ์ค‘ ์ ์–ด๋„ ํ•œ ๊ตฌ๊ฐ„์€ ascending order๊ฐ€ ๋ณด์žฅ๋œ๋‹ค.
10+
- ascendingํ•˜๋Š” ๊ตฌ๊ฐ„์— ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด ์žˆ๋Š”์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ binary search์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ search ๊ฐ€๋Šฅ.
11+
- ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋œ๋‹ค.
12+
13+
SC:
14+
- binary search์™€ ๋น„์Šทํ•˜๊ฒŒ, ํƒ์ƒ‰ ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘, ๋, ์ค‘๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ๊ด€๋ฆฌ. O(1).
15+
16+
TC:
17+
- binary search์™€ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌ๊ฐ„์ด ๊ณ„์† ์ ˆ๋ฐ˜ ํฌ๊ธฐ๋กœ ์ค„์–ด๋“ ๋‹ค. O(log(n)).
18+
"""
19+
20+
21+
class Solution:
22+
def search(self, nums: List[int], target: int) -> int:
23+
s, e = 0, len(nums) - 1
24+
while s < e:
25+
m = (s + e) // 2
26+
27+
# ์ ˆ์ ์€ ํ•˜๋‚˜๋‹ค. [s, m]๊ณผ [m+1, e]๊ตฌ๊ฐ„ ์ค‘ ํ•œ ๊ณณ์— ์ ˆ์ ์กด์žฌ.
28+
# ์ ˆ์ ์ด ์—†๋Š” ๊ตฌ๊ฐ„์€ ascending order๊ฐ€ ๋ณด์žฅ๋˜๋ฏ€๋กœ,
29+
# ์ด ๊ตฌ๊ฐ„์— target์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋กœ ๋‘˜ ์ค‘ ํ•œ ๊ตฌ๊ฐ„์„ ํƒ์ƒ‰ ๊ตฌ๊ฐ„์—์„œ ์ œ์™ธํ•œ๋‹ค.
30+
if nums[s] < nums[m]:
31+
# [s, m] ๊ตฌ๊ฐ„์ด ascending order.
32+
if (nums[s] > target and nums[m] > target) or (
33+
nums[s] < target and nums[m] < target
34+
):
35+
# nums[s]์™€ nums[m]์ด target๋ณด๋‹ค ๋‘˜ ๋‹ค ํฌ๊ฑฐ๋‚˜ ๋‘˜ ๋‹ค ์ž‘์œผ๋ฉด
36+
# [m + 1, e] ๊ตฌ๊ฐ„์—์„œ ํƒ์ƒ‰์„ ์ด์–ด๊ฐ„๋‹ค.
37+
s = m + 1
38+
else:
39+
# ์•„๋‹ˆ๋ฉด [s, m] ๊ตฌ๊ฐ„์—์„œ ํƒ์ƒ‰์„ ์ด์–ด๊ฐ„๋‹ค.
40+
e = m
41+
else:
42+
# [m + 1, e] ๊ตฌ๊ฐ„์ด ascending order.
43+
if (nums[m + 1] > target and nums[e] > target) or (
44+
nums[m + 1] < target and nums[e] < target
45+
):
46+
# nums[m + 1]๊ณผ nums[e]๊ฐ€ target๋ณด๋‹ค ๋‘˜ ๋‹ค ํฌ๊ฑฐ๋‚˜ ๋‘˜ ๋‹ค ์ž‘์œผ๋ฉด
47+
# [s, m] ๊ตฌ๊ฐ„์—์„œ ํƒ์ƒ‰์„ ์ด์–ด๊ฐ„๋‹ค.
48+
e = m
49+
else:
50+
# ์•„๋‹ˆ๋ฉด [m + 1, e] ๊ตฌ๊ฐ„์—์„œ ํƒ์ƒ‰์„ ์ด์–ด๊ฐ„๋‹ค.
51+
s = m + 1
52+
53+
return s if nums[s] == target else -1

0 commit comments

Comments
ย (0)