Skip to content

Commit 5383dff

Browse files
authored
Merge pull request #1349 from yyyyyyyyyKim/main
[yyyyyyyyyKim] WEEK 04 solutions
2 parents 367b85d + 761312e commit 5383dff

File tree

5 files changed

+127
-0
lines changed

5 files changed

+127
-0
lines changed

coin-change/yyyyyyyyyKim.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution:
2+
def coinChange(self, coins: List[int], amount: int) -> int:
3+
4+
# DP
5+
dp = [10001]*(amount+1)
6+
dp[0] = 0
7+
8+
# 1부터 amount까지 만들 수 있는 최소 동전의 수를 dp에 업데이트
9+
for i in range(1, amount+1):
10+
for j in coins:
11+
# dp[i-j]+1 : (i-j)원을 만드는 최소 동전 수 + 현재동전(j) 1개 사용
12+
# 현재금액(i)를 만들 수 있는 최소 동전 수 업데이트
13+
if i - j >= 0:
14+
dp[i] = min(dp[i], dp[i-j]+1)
15+
16+
# 업데이트된 값이 없으면 -1 리턴
17+
if dp[amount] == 10001:
18+
return -1
19+
else:
20+
return dp[amount]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution:
2+
def findMin(self, nums: List[int]) -> int:
3+
"""
4+
시간복잡도: O(log n) - 이진 탐색
5+
공간복잡도: O(1) - 추가 메모리 없음
6+
"""
7+
8+
# 이진탐색
9+
left = 0
10+
right = len(nums) - 1
11+
12+
while left < right:
13+
# 중간 인덱스
14+
mid = (left+right)//2
15+
16+
# 최소값이 오른쪽에 있음
17+
if nums[mid] > nums[right]:
18+
left = mid + 1
19+
# 최소값이 왼쪽(중간포함)에 있음
20+
else:
21+
right = mid
22+
23+
# 최종 최소값
24+
return nums[left]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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+
10+
# DFS, 재귀
11+
def dfs(root):
12+
# 노드가 없으면 깊이 0
13+
if not root:
14+
return 0
15+
16+
# 왼쪽과 오른쪽 중 더 깊은 쪽 + 1 리턴
17+
return 1 + max(dfs(root.left), dfs(root.right))
18+
19+
return dfs(root)
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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+
dummy = ListNode(-1) # 더미 시작 노드
10+
current = dummy # 현재 연결 위치 포인터
11+
12+
while list1 and list2:
13+
14+
# 현재list1의 값과 현재list2값을 비교해서 current.next 연결
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+
22+
# current 다음으로 이동
23+
current = current.next
24+
25+
# 둘 중 하나가 남아있다면 나머지를 통째로 붙이기(삼항 연산자)
26+
current.next = list1 if list1 else list2
27+
# if list1:
28+
# current.next = list1
29+
# else:
30+
# current.next = list2
31+
32+
return dummy.next

word-search/yyyyyyyyyKim.py

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution:
2+
def exist(self, board: List[List[str]], word: str) -> bool:
3+
4+
# 백트래킹, DFS, 재귀
5+
def dfs(x, y, idx):
6+
# 모든 글자를 다 찾았다면 True 리턴해서 종료
7+
if idx == len(word):
8+
return True
9+
10+
# 범위벗어나거나, 다른글자라면 False 리턴해서 종료(pruning가지치기)
11+
if x < 0 or y < 0 or x >= len(board) or y >= len(board[0]) or board[x][y] != word[idx]:
12+
return False
13+
14+
t = board[x][y] # 현재값 t에 임시저장
15+
board[x][y] = ' ' # 방문표시
16+
17+
# 모든 방향(상하좌우) 탐색
18+
for i, j in [(-1,0), (1,0), (0,-1), (0,1)]:
19+
if dfs(x+i, y+j, idx+1):
20+
return True
21+
22+
board[x][y] = t # 방문복원
23+
24+
return False
25+
26+
27+
for i in range(len(board)):
28+
for j in range(len(board[0])):
29+
if dfs(i, j, 0):
30+
return True
31+
32+
return False

0 commit comments

Comments
 (0)