Skip to content

Commit 64ad68a

Browse files
week4
week4
1 parent 8ed7718 commit 64ad68a

File tree

2 files changed

+81
-90
lines changed

2 files changed

+81
-90
lines changed
Lines changed: 43 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,54 @@
1-
# Definition for a binary tree node.
1+
# ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ํด๋ž˜์Šค
22
class TreeNode:
33
def __init__(self, val=0, left=None, right=None):
4-
self.val = val
5-
self.left = left
6-
self.right = right
4+
self.val = val # ๋…ธ๋“œ์˜ ๊ฐ’
5+
self.left = left # ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ
6+
self.right = right # ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ
7+
78

89
class Solution:
910
def maxDepth(self, root: TreeNode) -> int:
10-
# ๋ฃจํŠธ๊ฐ€ None์ด๋ฉด ๊นŠ์ด๋Š” 0
11+
# ์ดˆ๊ธฐ ์กฐ๊ฑด ํ™•์ธ. ํŠธ๋ฆฌ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊นŠ์ด๋Š” 0
1112
if not root:
1213
return 0
1314

14-
# ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๊ณ„์‚ฐ
15-
left_depth = self.maxDepth(root.left)
16-
right_depth = self.maxDepth(root.right)
15+
# ํ์— ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€, ๊นŠ์ด๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
16+
queue = [root]
17+
depth = 0
1718

18-
# ํ˜„์žฌ ๋…ธ๋“œ์˜ ๊นŠ์ด(1) + ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ค‘ ๋” ํฐ ๊นŠ์ด
19-
return 1 + max(left_depth, right_depth)
20-
21-
# ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
22-
def create_binary_tree(lst):
23-
if not lst:
24-
return None
25-
26-
root = TreeNode(lst[0])
27-
queue = [root]
28-
i = 1
19+
# ๋„ˆ๋น„์šฐ์„  ํƒ์ƒ‰(BFS) ์‹คํ–‰. ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์€ ๋™์•ˆ ๋ฐ˜๋ณต
20+
while queue:
21+
# ์ƒˆ๋กœ์šด ๋ ˆ๋ฒจ ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ๊นŠ์ด ์ฆ๊ฐ€
22+
depth += 1
23+
# ํ˜„์žฌ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ ์ˆ˜ ์ €์žฅ
24+
level_size = len(queue)
25+
26+
# ํ˜„์žฌ ๋ ˆ๋ฒจ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ
27+
for _ in range(level_size):
28+
# ํ์—์„œ ๋…ธ๋“œ ํ•˜๋‚˜ ๊บผ๋‚ด๊ธฐ
29+
node = queue.pop(0)
30+
31+
# ์ž์‹ ๋…ธ๋“œ ์ฒ˜๋ฆฌ. ๋‹ค์Œ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ๋“ค์ด ๋จ
32+
## ์™ผ์ชฝ ์ž์‹์ด ์žˆ์œผ๋ฉด ํ์— ์ถ”๊ฐ€
33+
if node.left:
34+
queue.append(node.left)
35+
## ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ์žˆ์œผ๋ฉด ํ์— ์ถ”๊ฐ€
36+
if node.right:
37+
queue.append(node.right)
2938

30-
while queue and i < len(lst):
31-
current = queue.pop(0)
32-
33-
if lst[i] is not None:
34-
current.left = TreeNode(lst[i])
35-
queue.append(current.left)
36-
i += 1
37-
38-
if i < len(lst) and lst[i] is not None:
39-
current.right = TreeNode(lst[i])
40-
queue.append(current.right)
41-
i += 1
42-
43-
return root
44-
45-
# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค
46-
solution = Solution()
47-
48-
# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 1: [3,9,20,None,None,15,7]
49-
tree1 = create_binary_tree([3,9,20,None,None,15,7])
50-
print(solution.maxDepth(tree1)) # 3 ์ถœ๋ ฅ
51-
52-
# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 2: [1,None,2]
53-
tree2 = create_binary_tree([1,None,2])
54-
print(solution.maxDepth(tree2)) # 2 ์ถœ๋ ฅ
39+
# ์ตœ์ข… ๊นŠ์ด ๋ฐ˜ํ™˜
40+
return depth
5541

56-
# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 3: []
57-
tree3 = create_binary_tree([])
58-
print(solution.maxDepth(tree3)) # 0 ์ถœ๋ ฅ
42+
#์‹œ๊ฐ„ ๋ณต์žก๋„ (Time Complexity): O(n)
43+
#n: ํŠธ๋ฆฌ์˜ ์ด ๋…ธ๋“œ ์ˆ˜
44+
#์ด์œ :
45+
#๊ฐ ๋…ธ๋“œ๋ฅผ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธ
46+
#๊ฐ ๋…ธ๋“œ์—์„œ์˜ ์—ฐ์‚ฐ(์ถ”๊ฐ€, ์ œ๊ฑฐ)์€ ์ƒ์ˆ˜ ์‹œ๊ฐ„
47+
#๋”ฐ๋ผ์„œ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n)
48+
#๊ณต๊ฐ„ ๋ณต์žก๋„ (Space Complexity): O(n)
49+
#์ตœ์•…์˜ ๊ฒฝ์šฐ: O(n)
50+
#ํ‰๊ท ์ ์ธ ๊ฒฝ์šฐ: O(n/2) โ‰ˆ O(n)
51+
#์ด์œ :
52+
#ํ์— ์ €์žฅ๋˜๋Š” ์ตœ๋Œ€ ๋…ธ๋“œ ์ˆ˜๋Š” ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๋„ˆ๋น„
53+
#์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์— ์•ฝ n/2๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ
54+
#๋”ฐ๋ผ์„œ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n)
Lines changed: 38 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,64 @@
1-
# Definition for singly-linked list.
1+
# ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ํด๋ž˜์Šค
22
class ListNode:
33
def __init__(self, val=0, next=None):
4+
# ๋…ธ๋“œ์˜ ๊ฐ’
45
self.val = val
6+
# ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
57
self.next = next
68

9+
710
class Solution:
8-
def mergeTwoLists(self, list1: ListNode, list2: ListNode) -> ListNode:
9-
# ๋”๋ฏธ ๋…ธ๋“œ ์ƒ์„ฑ
11+
def mergeTwoLists(self, list1: ListNode, list2: ListNode):
12+
# ๋”๋ฏธ ๋…ธ๋“œ ์ƒ์„ฑ - ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์ ์œผ๋กœ ์‚ฌ์šฉ
1013
dummy = ListNode()
14+
# ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ถ”์ ํ•˜๋Š” ํฌ์ธํ„ฐ
1115
current = dummy
1216

13-
# ๋‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๋™์•ˆ ๋ฐ˜๋ณต
17+
# ๋ณ‘ํ•ฉ๊ณผ์ • : ๋‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๋™์•ˆ ๋ฐ˜๋ณต,
18+
# ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€,
19+
# ์„ ํƒ๋œ ๋ฆฌ์ŠคํŠธ์˜ ํฌ์ธํ„ฐ๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ด๋™
20+
# ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์˜ ํฌ์ธํ„ฐ๋„ ๋‹ค์Œ์œผ๋กœ ์ด๋™
1421
while list1 and list2:
22+
# list 1์˜ ๊ฐ’์ด list2์˜ ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ
1523
if list1.val <= list2.val:
24+
# list1์˜ ๋…ธ๋“œ๋ฅผ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€
1625
current.next = list1
26+
#list1์˜ ํฌ์ธํ„ฐ๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ด๋™
1727
list1 = list1.next
1828
else:
29+
#list2์˜ ๋…ธ๋“œ๋ฅผ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€
1930
current.next = list2
31+
#list2์˜ ํฌ์ธํ„ฐ๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ด๋™
2032
list2 = list2.next
33+
#๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์˜ ํฌ์ธํ„ฐ๋ฅผ ๋‹ค์Œ์œผ๋กœ ์ด๋™
2134
current = current.next
2235

23-
# ๋‚จ์€ ๋…ธ๋“œ๋“ค ์—ฐ๊ฒฐ
36+
# ํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ์˜ ๋‚จ์€ ๋…ธ๋“œ๋“ค์„ ๋ชจ๋‘ ์—ฐ๊ฒฐ
37+
## list1์— ๋‚จ์€ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๋ชจ๋‘ ์—ฐ๊ฒฐ
2438
if list1:
2539
current.next = list1
40+
41+
## list2์— ๋‚จ์€ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๋ชจ๋‘ ์—ฐ๊ฒฐ
2642
else:
2743
current.next = list2
28-
29-
return dummy.next
30-
31-
# ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
32-
def create_linked_list(lst):
33-
if not lst:
34-
return None
35-
head = ListNode(lst[0])
36-
current = head
37-
for val in lst[1:]:
38-
current.next = ListNode(val)
39-
current = current.next
40-
return head
4144

42-
def linked_list_to_list(head):
43-
result = []
44-
while head:
45-
result.append(head.val)
46-
head = head.next
47-
return result
48-
49-
# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค
50-
solution = Solution()
51-
52-
# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 1
53-
list1 = create_linked_list([1,2,4])
54-
list2 = create_linked_list([1,3,4])
55-
result = solution.mergeTwoLists(list1, list2)
56-
print(linked_list_to_list(result)) # [1,1,2,3,4,4]
45+
# ๋”๋ฏธ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ถ€ํ„ฐ๊ฐ€ ์‹ค์ œ ๊ฒฐ๊ณผ
46+
return dummy.next
5747

58-
# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 2
59-
list1 = create_linked_list([])
60-
list2 = create_linked_list([])
61-
result = solution.mergeTwoLists(list1, list2)
62-
print(linked_list_to_list(result)) # []
6348

64-
# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 3
65-
list1 = create_linked_list([])
66-
list2 = create_linked_list([0])
67-
result = solution.mergeTwoLists(list1, list2)
68-
print(linked_list_to_list(result)) # [0]
49+
#์‹œ๊ฐ„ ๋ณต์žก๋„ (Time Complexity): O(n + m)
50+
#n: list1์˜ ๊ธธ์ด
51+
#m: list2์˜ ๊ธธ์ด
52+
#์ด์œ :
53+
#๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธ
54+
#๊ฐ ๋…ธ๋“œ์—์„œ์˜ ์—ฐ์‚ฐ(๋น„๊ต, ์—ฐ๊ฒฐ)์€ ์ƒ์ˆ˜ ์‹œ๊ฐ„
55+
#๋”ฐ๋ผ์„œ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n + m)
56+
#๊ณต๊ฐ„ ๋ณต์žก๋„ (Space Complexity): O(1)
57+
#์ด์œ :
58+
#์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
59+
#์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜:
60+
#dummy: ์ƒ์ˆ˜ ๊ณต๊ฐ„
61+
#current: ์ƒ์ˆ˜ ๊ณต๊ฐ„
62+
#์ž…๋ ฅ ํฌ๊ธฐ์™€ ๊ด€๊ณ„์—†์ด ์ผ์ •ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ์‚ฌ์šฉ
63+
#๋”ฐ๋ผ์„œ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(1)
6964

0 commit comments

Comments
ย (0)