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

โ€Žcourse-schedule/yyyyyyyyyKim.py

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)