Skip to content

Commit 28ce3ba

Browse files
authored
[freemjstudio] WEEK 04 Solutions (#2752)
* merged-two-sorted-lists * maximum-depth-of-binary-tree/freemjstudio.py * coin change * add: coin change solution by freemjstudio * find-minimum-in-rotated-sorted-array * word-search
1 parent 5bcbd05 commit 28ce3ba

5 files changed

Lines changed: 118 additions & 0 deletions

File tree

coin-change/freemjstudio.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution:
2+
def coinChange(self, coins: List[int], amount: int) -> int:
3+
if amount == 0:
4+
return 0
5+
INF = int(1e9)
6+
# dp[n] 은 n 원을 만들기 위한 최소한의 동전 개수를 저장한다.
7+
dp = [INF] * (amount + 1)
8+
usable_coins = []
9+
for coin in coins:
10+
if coin == amount:
11+
return 1
12+
if coin < amount:
13+
dp[coin] = 1 # dp[3] = 1
14+
usable_coins.append(coin)
15+
16+
# dp 를 채워나가는 과정
17+
for i in range(1, amount+1):
18+
for coin in usable_coins:
19+
if (i - coin) >= 0 and dp[i - coin] != INF:
20+
dp[i] = min(dp[i - coin] + 1, dp[i])
21+
22+
return -1 if dp[amount] == INF else dp[amount]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution:
2+
def findMin(self, nums: List[int]) -> int:
3+
min_value = 5000
4+
# O(log n) 이므로 binary search
5+
if len(nums) == 1:
6+
return nums[0]
7+
left = 0
8+
right = len(nums) - 1
9+
10+
while left <= right:
11+
mid = (left + right) // 2
12+
min_value = min(nums[mid], min_value)
13+
14+
if nums[mid] > nums[right]:
15+
left = mid + 1
16+
else:
17+
right = mid - 1
18+
19+
return min_value
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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+
class Solution:
8+
def maxDepth(self, root: Optional[TreeNode]) -> int:
9+
if root is None:
10+
return 0
11+
12+
left = self.maxDepth(root.left)
13+
right = self.maxDepth(root.right)
14+
return max(left, right) + 1
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
dummy = ListNode()
9+
merged_list = dummy
10+
11+
while list1 is not None and list2 is not None:
12+
if list1.val <= list2.val:
13+
merged_list.next = list1
14+
list1 = list1.next
15+
else:
16+
merged_list.next = list2
17+
list2 = list2.next
18+
# merged_list 포인터를 한칸 이동시켜서 다음 노드 붙일 준비
19+
merged_list = merged_list.next
20+
21+
# 남아 있는 노드 붙이기
22+
merged_list.next = list1 if list1 is not None else list2
23+
24+
return dummy.next

word-search/freemjstudio.py

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

0 commit comments

Comments
 (0)