Skip to content

Commit 65fe9df

Browse files
week 4
week 4
1 parent ea4150c commit 65fe9df

File tree

5 files changed

+309
-0
lines changed

5 files changed

+309
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
'''
2+
이 λ¬Έμ œλŠ” 동적 ν”„λ‘œκ·Έλž˜λ°μ„ μ΄μš©ν•œ 방식이
3+
1) λͺ¨λ“  κ°€λŠ₯ν•œ 경우λ₯Ό μ²΄κ³„μ μœΌλ‘œ 계산할 수 있고,
4+
2) 쀑볡 계산을 ν”Όν•  수 있고,
5+
3) 졜적의 값을 보μž₯ν•œλ‹€λŠ” μ μ—μ„œ 쒋은 ν’€μ΄λ°©μ‹μž„.
6+
λ‹€λ§Œ,
7+
1) amountκ°€ 클 경우 λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ λ§Žμ„ 수 있고,
8+
2) λ™μ „μ˜ κ°€μΉ˜κ°€ 맀우 μž‘μ„ 경우 μ‹œκ°„μ΄ 였래 걸릴 수 μžˆλ‹€λŠ” μ μ—μ„œ 단점이 있음
9+
'''
10+
11+
class Solution:
12+
def coinChange(self, coins: List[int], amount: int) -> int:
13+
# μ΄ˆκΈ°ν™”
14+
# dp λ°°μ—΄: 각 κΈˆμ•‘μ„ λ§Œλ“€κΈ° μœ„ν•œ μ΅œμ†Œ 동전 수λ₯Ό μ €μž₯
15+
# amount + 1둜 μ΄ˆκΈ°ν™” (λΆˆκ°€λŠ₯ν•œ 경우λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄)
16+
# 0원을 λ§Œλ“€κΈ° μœ„ν•œ 동전 μˆ˜λŠ” 0
17+
dp = [amount + 1] * (amount + 1)
18+
dp[0] = 0
19+
20+
# 동적 ν”„λ‘œκ·Έλž˜λ° μ‹€ν–‰:
21+
# 1원뢀터 amountμ›κΉŒμ§€ 순차적으둜 계산
22+
for i in range(1, amount + 1):
23+
# 각 동전에 λŒ€ν•΄ μ‹œλ„
24+
for coin in coins:
25+
# ν˜„μž¬ κΈˆμ•‘μ΄ 동전보닀 ν¬κ±°λ‚˜ 같은 κ²½μš°μ—λ§Œ μ‹œλ„
26+
if i >= coin:
27+
# ν˜„μž¬ 동전을 μ‚¬μš©ν•˜λŠ” κ²½μš°μ™€ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 쀑 μ΅œμ†Œκ°’ 선택
28+
dp[i] = min(dp[i], dp[i - coin] + 1)
29+
30+
# κ²°κ³Ό λ°˜ν™˜
31+
# amount원을 λ§Œλ“€ 수 μ—†λŠ” 경우 -1 λ°˜ν™˜
32+
return dp[amount] if dp[amount] != amount + 1 else -1
33+
34+
# μ‹œκ°„ λ³΅μž‘λ„ (Time Complexity): O(n * m)
35+
#n: amount
36+
#m: coins의 길이
37+
#이유:
38+
#amountκΉŒμ§€μ˜ λͺ¨λ“  κΈˆμ•‘μ— λŒ€ν•΄ 계산
39+
#각 κΈˆμ•‘λ§ˆλ‹€ λͺ¨λ“  동전을 확인
40+
#λ”°λΌμ„œ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n * m)
41+
# 곡간 λ³΅μž‘λ„ (Space Complexity): O(n)
42+
# n: amount
43+
#이유:
44+
# dp λ°°μ—΄μ˜ 크기가 amount + 1
45+
# 좔가적인 λ©”λͺ¨λ¦¬ μ‚¬μš© μ—†μŒ
46+
# λ”°λΌμ„œ 곡간 λ³΅μž‘λ„λŠ” O(n)
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# λ°±νŠΈλž˜ν‚Ή 방법을 μ‚¬μš©ν•˜μ—¬ 풀이함
2+
class Solution:
3+
def exist(self, board: List[List[str]], word: str) -> bool:
4+
# λ³΄λ“œμ˜ ν–‰κ³Ό μ—΄ 수
5+
rows, cols = len(board), len(board[0])
6+
# λ°©λ¬Έν•œ 셀을 μΆ”μ ν•˜λŠ” μ§‘ν•©
7+
visited = set()
8+
9+
# κΉŠμ΄μš°μ„  탐색(DFS) ν•¨μˆ˜ μ •μ˜
10+
#r, c은 ν˜„μž¬ μ…€μ˜ ν–‰κ³Ό μ—΄, iλŠ” ν˜„μž¬ μ°Ύκ³  μžˆλŠ” λ‹¨μ–΄μ˜ 인덱슀
11+
def dfs(r, c, i):
12+
#κΈ°λ³Έ 쑰건 확인
13+
# λ‹¨μ–΄μ˜ λͺ¨λ“  문자λ₯Ό 찾은 경우 성곡
14+
if i == len(word):
15+
return True
16+
17+
#μœΊνš¨μ„± 검사
18+
# λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κ±°λ‚˜ 이미 λ°©λ¬Έν–ˆκ±°λ‚˜ ν˜„μž¬ μ…€μ˜ λ¬Έμžκ°€ λ‹¨μ–΄μ˜ ν˜„μž¬ λ¬Έμžμ™€ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” 경우
19+
if (r < 0 or c < 0 or
20+
r >= rows or c >= cols or
21+
(r, c) in visited or
22+
board[r][c] != word[i]):
23+
return False
24+
25+
# ν˜„μž¬ 셀을 λ°©λ¬Έν–ˆλ‹€κ³  ν‘œμ‹œ
26+
visited.add((r, c))
27+
28+
# μƒν•˜μ’Œμš° λ°©ν–₯으둜 탐색
29+
result = (dfs(r + 1, c, i + 1) or # μ•„λž˜
30+
dfs(r - 1, c, i + 1) or # μœ„
31+
dfs(r, c + 1, i + 1) or # 였λ₯Έμͺ½
32+
dfs(r, c - 1, i + 1)) # μ™Όμͺ½
33+
34+
# λ°±νŠΈλž˜ν‚Ή: ν˜„μž¬ 셀을 λ°©λ¬Έν•˜μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ ν‘œμ‹œ
35+
#ν˜„μž¬ κ²½λ‘œκ°€ μ‹€νŒ¨ν–ˆμœΌλ―€λ‘œ λ°©λ¬Έ ν‘œμ‹œ 제거
36+
visited.remove((r, c))
37+
38+
return result
39+
40+
# λ³΄λ“œμ˜ λͺ¨λ“  μ…€μ—μ„œ μ‹œμž‘μ μœΌλ‘œ μ‹œλ„
41+
for r in range(rows):
42+
for c in range(cols):
43+
if dfs(r, c, 0):
44+
return True
45+
46+
return False
47+
48+
#μ‹œκ°„ λ³΅μž‘λ„ (Time Complexity): O(m * n * 4^L)
49+
#m: λ³΄λ“œμ˜ ν–‰ 수
50+
#n: λ³΄λ“œμ˜ μ—΄ 수
51+
#L: λ‹¨μ–΄μ˜ 길이
52+
#이유:
53+
#각 μ…€μ—μ„œ μ‹œμž‘ν•  수 있음: O(m * n)
54+
#각 μœ„μΉ˜μ—μ„œ 4λ°©ν–₯으둜 탐색 κ°€λŠ₯: O(4^L)
55+
#μ΅œμ•…μ˜ 경우 λͺ¨λ“  경둜λ₯Ό 탐색해야 함
56+
#λ”°λΌμ„œ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(m * n * 4^L)
57+
#곡간 λ³΅μž‘λ„ (Space Complexity): O(L)
58+
#L: λ‹¨μ–΄μ˜ 길이
59+
#이유:
60+
#μž¬κ·€ 호좜 μŠ€νƒμ˜ κΉŠμ΄λŠ” λ‹¨μ–΄μ˜ 길이에 λΉ„λ‘€
61+
#visited μ§‘ν•©μ˜ 크기도 λ‹¨μ–΄μ˜ 길이에 λΉ„λ‘€
62+
#λ”°λΌμ„œ 곡간 λ³΅μž‘λ„λŠ” O(L)
63+
#DFS vs BFS 비ꡐ:
64+
#DFS (깊이 μš°μ„  탐색):
65+
#ν•œ 경둜λ₯Ό λκΉŒμ§€ 탐색
66+
#μŠ€νƒ/μž¬κ·€ μ‚¬μš©
67+
#λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ 적음
68+
#μ΅œλ‹¨ 경둜 보μž₯ν•˜μ§€ μ•ŠμŒ
69+
#BFS (λ„ˆλΉ„ μš°μ„  탐색):
70+
#같은 레벨의 λͺ¨λ“  λ…Έλ“œλ₯Ό λ¨Όμ € 탐색
71+
#큐 μ‚¬μš©
72+
#λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ 많음
73+
#μ΅œλ‹¨ 경둜 보μž₯
74+
75+
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# Definition for a binary tree node.
2+
class TreeNode:
3+
def __init__(self, val=0, left=None, right=None):
4+
self.val = val
5+
self.left = left
6+
self.right = right
7+
8+
class Solution:
9+
def maxDepth(self, root: TreeNode) -> int:
10+
# λ£¨νŠΈκ°€ None이면 κΉŠμ΄λŠ” 0
11+
if not root:
12+
return 0
13+
14+
# μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬μ™€ 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬μ˜ μ΅œλŒ€ 깊이λ₯Ό μž¬κ·€μ μœΌλ‘œ 계산
15+
left_depth = self.maxDepth(root.left)
16+
right_depth = self.maxDepth(root.right)
17+
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
29+
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 좜λ ₯
55+
56+
# ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 3: []
57+
tree3 = create_binary_tree([])
58+
print(solution.maxDepth(tree3)) # 0 좜λ ₯
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Definition for singly-linked list.
2+
class ListNode:
3+
def __init__(self, val=0, next=None):
4+
self.val = val
5+
self.next = next
6+
7+
class Solution:
8+
def mergeTwoLists(self, list1: ListNode, list2: ListNode) -> ListNode:
9+
# 더미 λ…Έλ“œ 생성
10+
dummy = ListNode()
11+
current = dummy
12+
13+
# 두 λ¦¬μŠ€νŠΈκ°€ λͺ¨λ‘ μ‘΄μž¬ν•˜λŠ” λ™μ•ˆ 반볡
14+
while list1 and list2:
15+
if list1.val <= list2.val:
16+
current.next = list1
17+
list1 = list1.next
18+
else:
19+
current.next = list2
20+
list2 = list2.next
21+
current = current.next
22+
23+
# 남은 λ…Έλ“œλ“€ μ—°κ²°
24+
if list1:
25+
current.next = list1
26+
else:
27+
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
41+
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]
57+
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)) # []
63+
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]
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# λ°±νŠΈλž˜ν‚Ή 방법을 μ‚¬μš©ν•˜μ—¬ 풀이함
2+
class Solution:
3+
def exist(self, board: List[List[str]], word: str) -> bool:
4+
# λ³΄λ“œμ˜ ν–‰κ³Ό μ—΄ 수
5+
rows, cols = len(board), len(board[0])
6+
# λ°©λ¬Έν•œ 셀을 μΆ”μ ν•˜λŠ” μ§‘ν•©
7+
visited = set()
8+
9+
# κΉŠμ΄μš°μ„  탐색(DFS) ν•¨μˆ˜ μ •μ˜
10+
#r, c은 ν˜„μž¬ μ…€μ˜ ν–‰κ³Ό μ—΄, iλŠ” ν˜„μž¬ μ°Ύκ³  μžˆλŠ” λ‹¨μ–΄μ˜ 인덱슀
11+
def dfs(r, c, i):
12+
#κΈ°λ³Έ 쑰건 확인
13+
# λ‹¨μ–΄μ˜ λͺ¨λ“  문자λ₯Ό 찾은 경우 성곡
14+
if i == len(word):
15+
return True
16+
17+
#μœΊνš¨μ„± 검사
18+
# λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κ±°λ‚˜ 이미 λ°©λ¬Έν–ˆκ±°λ‚˜ ν˜„μž¬ μ…€μ˜ λ¬Έμžκ°€ λ‹¨μ–΄μ˜ ν˜„μž¬ λ¬Έμžμ™€ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” 경우
19+
if (r < 0 or c < 0 or
20+
r >= rows or c >= cols or
21+
(r, c) in visited or
22+
board[r][c] != word[i]):
23+
return False
24+
25+
# ν˜„μž¬ 셀을 λ°©λ¬Έν–ˆλ‹€κ³  ν‘œμ‹œ
26+
visited.add((r, c))
27+
28+
# μƒν•˜μ’Œμš° λ°©ν–₯으둜 탐색
29+
result = (dfs(r + 1, c, i + 1) or # μ•„λž˜
30+
dfs(r - 1, c, i + 1) or # μœ„
31+
dfs(r, c + 1, i + 1) or # 였λ₯Έμͺ½
32+
dfs(r, c - 1, i + 1)) # μ™Όμͺ½
33+
34+
# λ°±νŠΈλž˜ν‚Ή: ν˜„μž¬ 셀을 λ°©λ¬Έν•˜μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ ν‘œμ‹œ
35+
#ν˜„μž¬ κ²½λ‘œκ°€ μ‹€νŒ¨ν–ˆμœΌλ―€λ‘œ λ°©λ¬Έ ν‘œμ‹œ 제거
36+
visited.remove((r, c))
37+
38+
return result
39+
40+
# λ³΄λ“œμ˜ λͺ¨λ“  μ…€μ—μ„œ μ‹œμž‘μ μœΌλ‘œ μ‹œλ„
41+
for r in range(rows):
42+
for c in range(cols):
43+
if dfs(r, c, 0):
44+
return True
45+
46+
return False
47+
48+
#μ‹œκ°„ λ³΅μž‘λ„ (Time Complexity): O(m * n * 4^L)
49+
#m: λ³΄λ“œμ˜ ν–‰ 수
50+
#n: λ³΄λ“œμ˜ μ—΄ 수
51+
#L: λ‹¨μ–΄μ˜ 길이
52+
#이유:
53+
#각 μ…€μ—μ„œ μ‹œμž‘ν•  수 있음: O(m * n)
54+
#각 μœ„μΉ˜μ—μ„œ 4λ°©ν–₯으둜 탐색 κ°€λŠ₯: O(4^L)
55+
#μ΅œμ•…μ˜ 경우 λͺ¨λ“  경둜λ₯Ό 탐색해야 함
56+
#λ”°λΌμ„œ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(m * n * 4^L)
57+
#곡간 λ³΅μž‘λ„ (Space Complexity): O(L)
58+
#L: λ‹¨μ–΄μ˜ 길이
59+
#이유:
60+
#μž¬κ·€ 호좜 μŠ€νƒμ˜ κΉŠμ΄λŠ” λ‹¨μ–΄μ˜ 길이에 λΉ„λ‘€
61+
#visited μ§‘ν•©μ˜ 크기도 λ‹¨μ–΄μ˜ 길이에 λΉ„λ‘€
62+
#λ”°λΌμ„œ 곡간 λ³΅μž‘λ„λŠ” O(L)

0 commit comments

Comments
Β (0)