Skip to content

Commit dd62e82

Browse files
authored
Merge pull request #2478 from sangbeenmoon/main
[sangbeenmoon] WEEK 04 Solutions
2 parents 94473f0 + bb9b1c3 commit dd62e82

File tree

5 files changed

+152
-0
lines changed

5 files changed

+152
-0
lines changed

coin-change/sangbeenmoon.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# dp[i] = min(dp[i - c0], dp[i - c1], ... , dp[i - cn]) + 1
2+
3+
# TC : O(amount * len(coins))
4+
# SC : O(amount)
5+
6+
class Solution:
7+
dp = []
8+
def coinChange(self, coins: List[int], amount: int) -> int:
9+
self.dp = [-2] * (amount + 10) # 아직 방문하지 않음 -> -2
10+
11+
return self.go(amount, coins)
12+
13+
14+
def go(self, x: int, coins: List[int]) -> int:
15+
if x == 0:
16+
return 0
17+
18+
if self.dp[x] != -2:
19+
return self.dp[x]
20+
21+
mm = 100000
22+
23+
for coin in coins:
24+
if x - coin >= 0:
25+
sub = self.go(x - coin, coins)
26+
if (sub == -1): # 불가능 -> -1
27+
continue
28+
mm = min(mm, sub + 1)
29+
30+
self.dp[x] = mm if mm != 100000 else -1 # memoization
31+
32+
return self.dp[x]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# TC : O(logN)
2+
# SC : 1
3+
4+
class Solution:
5+
def findMin(self, nums: List[int]) -> int:
6+
7+
left = 0
8+
right = len(nums) - 1
9+
mid = (left + right) // 2
10+
11+
if len(nums) == 2:
12+
return min(nums)
13+
14+
while left < right:
15+
mid = (left + right) // 2
16+
17+
if nums[mid] >= nums[right]:
18+
left = mid + 1
19+
else:
20+
right = mid
21+
22+
return nums[left]
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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+
# TC : O(n)
9+
# SC : O(n)
10+
11+
class Solution:
12+
answer = 0
13+
14+
def go(self, cur: TreeNode, depth:int):
15+
self.answer = max(self.answer, depth)
16+
if cur.left != None:
17+
self.go(cur.left, depth + 1)
18+
if cur.right != None:
19+
self.go(cur.right, depth + 1)
20+
21+
def maxDepth(self, root: Optional[TreeNode]) -> int:
22+
self.answer = 0
23+
24+
if root != None:
25+
self.go(root, 1)
26+
27+
return self.answer
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
class Solution:
7+
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
8+
9+
cur1 = list1
10+
cur2 = list2
11+
12+
answer = ListNode()
13+
head = answer
14+
15+
16+
while cur1 != None:
17+
if cur2 != None:
18+
if cur1.val >= cur2.val:
19+
answer.next = ListNode(cur2.val)
20+
cur2 = cur2.next
21+
answer = answer.next
22+
else:
23+
answer.next = ListNode(cur1.val)
24+
cur1 = cur1.next
25+
answer = answer.next
26+
else:
27+
answer.next = ListNode(cur1.val)
28+
cur1 = cur1.next
29+
answer = answer.next
30+
31+
while cur2 != None:
32+
answer.next = ListNode(cur2.val)
33+
cur2 = cur2.next
34+
answer = answer.next
35+
return head.next

word-search/sangbeenmoon.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# TC : O(m * n * 4^L)
2+
# SC : O(m * n + L)
3+
4+
class Solution:
5+
answer = False
6+
dx = [0,0,-1,1]
7+
dy = [-1,1,0,0]
8+
9+
def exist(self, board: List[List[str]], word: str) -> bool:
10+
11+
for yy in range(len(board)):
12+
for xx in range(len(board[0])):
13+
if board[yy][xx] == word[0]:
14+
self.visited = [ [False] * len(board[0]) for _ in range(len(board))]
15+
self.visited[yy][xx] = True
16+
self.dfs(board, word, xx, yy, 0)
17+
18+
19+
return self.answer
20+
21+
def dfs(self, board, word, cx, cy, idx):
22+
print(cx, cy, idx)
23+
if idx == len(word) - 1:
24+
self.answer = True
25+
26+
for i in range(4):
27+
nx = cx + self.dx[i]
28+
ny = cy + self.dy[i]
29+
30+
if 0 <= nx and nx < len(board[0]):
31+
if 0 <= ny and ny < len(board):
32+
if self.visited[ny][nx] == False:
33+
if idx + 1 <= len(word) - 1 and word[idx+1] == board[ny][nx]:
34+
self.visited[ny][nx] = True
35+
self.dfs(board, word, nx, ny, idx + 1)
36+
self.visited[ny][nx] = False

0 commit comments

Comments
 (0)