Skip to content

Commit 5e35d18

Browse files
authored
Merge pull request #1545 from yyyyyyyyyKim/main
[yyyyyyyyyKim] WEEK 10 solutions
2 parents 6d375f5 + 6c18060 commit 5e35d18

File tree

5 files changed

+193
-0
lines changed

5 files changed

+193
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class Solution:
2+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
3+
4+
# μž¬κ·€ DFS
5+
# κ·Έλž˜ν”„ λ§Œλ“€κΈ°
6+
# graph[i] = [j, ...] : iλ₯Ό λ“£κΈ° μœ„ν•΄ μ„ ν–‰ν•΄μ•Ό ν•˜λŠ” κ³Όλͺ©jλ“€ μ €μž₯
7+
graph = [[] for _ in range(numCourses)]
8+
for i, j in prerequisites:
9+
graph[i].append(j)
10+
11+
# visited
12+
# 0: λ°©λ¬Έ μ•ˆν•¨
13+
# 1: λ°©λ¬Έ 쀑(ν˜„μž¬ 탐색 쀑)
14+
# 2: λ°©λ¬Έ μ™„λ£Œ(사이클 μ—†μŒ 확인 μ™„λ£Œ)
15+
visited = [0]*numCourses
16+
17+
def dfs(course):
18+
# λ°©λ¬Έ 쀑인데 또 λ°©λ¬Έ = 사이클 쑴재 -> False
19+
if visited[course] == 1:
20+
return False
21+
22+
# 이미 λ°©λ¬Έ μ™„λ£Œ(탐색 μ™„λ£Œ)
23+
if visited[course] == 2:
24+
return True
25+
26+
# λ°©λ¬Έ 쀑 ν‘œμ‹œ
27+
visited[course] = 1
28+
29+
# μ„ ν–‰κ³Όλͺ©λ“€ DFS둜 확인
30+
for i in graph[course]:
31+
if not dfs(i):
32+
return False
33+
34+
# 탐색 μ™„λ£Œ(λ°©λ¬Έ μ™„λ£Œ)
35+
visited[course] = 2
36+
37+
return True
38+
39+
# λͺ¨λ“  κ³Όλͺ© DFS 탐색
40+
for i in range(numCourses):
41+
if not dfs(i):
42+
return False
43+
44+
return True
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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 invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
9+
10+
# μ΄μ§„νŠΈλ¦¬ λ’€μ§‘κΈ°(μ’Œμš°λ°˜μ „)
11+
# DFS(stack이용, μ‹œκ°„λ³΅μž‘λ„ O(n), κ³΅κ°„λ³΅μž‘λ„ O(n))
12+
if not root:
13+
return None
14+
15+
stack = [root]
16+
17+
while stack:
18+
# μŠ€νƒ 맨뒀에 μžˆλŠ” κ±° popν•΄μ„œ κΊΌλ‚΄κΈ°
19+
node = stack.pop()
20+
21+
# μžμ‹ λ…Έλ“œ κ΅ν™˜
22+
node.left, node.right = node.right, node.left
23+
24+
# μžμ‹ λ…Έλ“œλ₯Ό μŠ€νƒμ— μΆ”κ°€
25+
if node.left:
26+
stack.append(node.left)
27+
if node.right:
28+
stack.append(node.right)
29+
30+
return root

β€Žjump-game/yyyyyyyyyKim.pyβ€Ž

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution:
2+
def canJump(self, nums: List[int]) -> bool:
3+
4+
# 그리디(μ‹œκ°„λ³΅μž‘λ„ O(n), κ³΅κ°„λ³΅μž‘λ„ O(1))
5+
max_reach = 0 # κ°€μž₯ 멀리 갈 수 μžˆλŠ” μœ„μΉ˜
6+
7+
for i in range(len(nums)):
8+
# max_reachκ°€ i보닀 μž‘μœΌλ©΄ nums[i]에 도달 λΆˆκ°€ -> False
9+
if i > max_reach:
10+
return False
11+
# ν˜„μž¬ μœ„μΉ˜iμ—μ„œ μ ν”„ν–ˆμ„ λ•Œ 도달 κ°€λŠ₯ν•œ μ΅œλŒ€ μœ„μΉ˜ μ—…λ°μ΄νŠΈ
12+
max_reach = max(max_reach, i + nums[i])
13+
14+
# 도달 κ°€λŠ₯
15+
return True
16+
17+
18+
# # μ•„λž˜ 방식(DP)은 μ‹œκ°„μ΄ˆκ³ΌλœΈ.
19+
# # DP(μ‹œκ°„λ³΅μž‘λ„ O(n^2), κ³΅κ°„λ³΅μž‘λ„ O(n))
20+
# # dp[i] = iλ²ˆμ§Έμ— 도달 κ°€λŠ₯ν•œμ§€ μ—¬λΆ€
21+
# dp = [False]*len(nums)
22+
# dp[0] = True # μ‹œμž‘μ μ€ 항상 도달 κ°€λŠ₯
23+
24+
# for i in range(1,len(nums)):
25+
# for j in range(i):
26+
# # jκΉŒμ§€ 갈 수 있고, jμ—μ„œ iκΉŒμ§€ 점프 κ°€λŠ₯ν•˜λ©΄, True둜 λ°”κΎΈκ³  break(더 λ³Ό ν•„μš”μ—†μŒ)
27+
# if dp[j] and j + nums[j] >= i:
28+
# dp[i] = True
29+
# break
30+
31+
# # λ§ˆμ§€λ§‰ 인덱슀 도달 μ—¬λΆ€
32+
# return dp[-1]
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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 mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
8+
# 뢄할정볡(divide and conquer), μ‰½μ§€μ•ŠμŒ,λ‹€μ‹œλ³Όκ²ƒ,λ‹€λ₯Έλ°©μ‹ν’€μ΄λ“€μ°Ύμ•„볼것.
9+
10+
# 빈 리슀트일 경우 None λ°˜ν™˜
11+
if len(lists) == 0:
12+
return None
13+
14+
# 두 개의 리슀트 λ³‘ν•©ν•˜λŠ” ν•¨μˆ˜
15+
def merge(list1, list2):
16+
dummy = ListNode() # μ‹œμž‘λ…Έλ“œ
17+
tail = dummy # dummy의 끝을 κ°€λ¦¬ν‚€λŠ” 포인터
18+
19+
# list1와 list2에 λ…Έλ“œκ°€ μžˆμ„ λ™μ•ˆ 반볡
20+
while list1 and list2:
21+
# list1κ°’κ³Ό list2κ°’ 쀑 더 μž‘μ€ λ…Έλ“œ 값을 dummy에 μΆ”κ°€
22+
if list1.val < list2.val:
23+
tail.next = list1
24+
list1 = list1.next
25+
else:
26+
tail.next = list2
27+
list2 = list2.next
28+
tail = tail.next
29+
30+
# 남은 λ…Έλ“œλ“€ 뢙이기
31+
if list1:
32+
tail.next = list1
33+
if list2:
34+
tail.next = list2
35+
36+
# dummy의 λ‹€μŒμ΄ 병합 κ²°κ³Ό
37+
return dummy.next
38+
39+
# 전체 λ¦¬μŠ€νŠΈκ°€ ν•˜λ‚˜κ°€ 될 λ•ŒκΉŒμ§€ 병합
40+
while len(lists) > 1:
41+
merged = []
42+
43+
# 리슀트 두 κ°œμ”© λ³‘ν•©ν•˜κΈ°
44+
for i in range(0, len(lists), 2):
45+
list1 = lists[i]
46+
47+
if i + 1 < len(lists):
48+
list2 = lists[i+1]
49+
else:
50+
list2 = None
51+
52+
merged.append(merge(list1,list2))
53+
54+
# λ³‘ν•©λœ 리슀트둜 μ—…λ°μ΄νŠΈ
55+
lists = merged
56+
57+
# ν•˜λ‚˜λ‘œ λ³‘ν•©λœ 리슀트 λ°˜ν™˜
58+
return lists[0]
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution:
2+
def search(self, nums: List[int], target: int) -> int:
3+
4+
# νšŒμ „λœ μ •λ ¬ λ°°μ—΄μ—μ„œ 이진탐색(μ‹œκ°„λ³΅μž‘λ„ O(log n))
5+
left = 0
6+
right = len(nums)-1
7+
8+
while left <= right:
9+
mid = (left+right)//2
10+
11+
if nums[mid] == target:
12+
return mid
13+
14+
# μ™Όμͺ½ μ •λ ¬
15+
if nums[left] <= nums[mid]:
16+
if nums[left] <= target < nums[mid]:
17+
right = mid - 1
18+
else:
19+
left = mid + 1
20+
21+
# 였λ₯Έμͺ½ μ •λ ¬
22+
else:
23+
if nums[mid] < target <= nums[right]:
24+
left = mid + 1
25+
else:
26+
right = mid - 1
27+
28+
# 탐색 후에도 타켓을 λ°œκ²¬ν•˜μ§€ λͺ»ν–ˆλ‹€λ©΄ -1 λ°˜ν™˜
29+
return -1

0 commit comments

Comments
Β (0)