Skip to content

Commit 9a1f0bd

Browse files
authored
Merge pull request #1921 from hi-rachel/main
[hi-rachel] WEEK 10 solutions
2 parents 9444de2 + e587045 commit 9a1f0bd

File tree

2 files changed

+122
-4
lines changed

2 files changed

+122
-4
lines changed

โ€Žcourse-schedule/hi-rachel.pyโ€Ž

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,104 @@ def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
5656
queue.append(neighbor)
5757

5858
return completed == numCourses
59+
60+
"""
61+
์œ„์ƒ ์ •๋ ฌ์„ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
62+
1. DFS ๊ธฐ๋ฐ˜ (์Šคํƒ์„ ์Œ“์•„ ๋’ค์ง‘๋Š” ๋ฐฉ์‹)
63+
2. Kahn ์•Œ๊ณ ๋ฆฌ์ฆ˜ (์ง„์ž…์ฐจ์ˆ˜ 0๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ํ ์ฒ˜๋ฆฌ)
64+
65+
Kahn ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?
66+
๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์ง„์ž…์ฐจ์ˆ˜(indegree)๊ฐ€ 0์ธ ์ •์ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ์ œ๊ฑฐ(ํ์— ๋„ฃ์–ด ๊บผ๋‚ด๊ธฐ)ํ•˜๋ฉฐ ์œ„์ƒ ์ˆœ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•.
67+
์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ์ •์ ์ด ํ•˜๋‚˜๋„ ์—†๋Š”๋ฐ ์•„์ง ๋‚จ์€ ์ •์ ์ด ์žˆ๋‹ค๋ฉด ์‚ฌ์ดํด ์กด์žฌ -> ์œ„์ƒ ์ •๋ ฌ ๋ถˆ๊ฐ€.
68+
69+
์œ„์ƒ ์ˆœ์„œ: ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ„์„ (uโ†’v)์ด ์žˆ๋‹ค๋ฉด, ์ˆœ์„œ์—์„œ u๊ฐ€ ํ•ญ์ƒ v๋ณด๋‹ค ์•ž์— ๋‚˜์˜ค๋Š” ์ •์ ๋“ค์˜ ๋‚˜์—ด.
70+
์ง„์ž…์ฐจ์ˆ˜: ์ •์ ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜.
71+
72+
73+
TC: O(V + E), V: ๊ณผ๋ชฉ ์ˆ˜, E: prerequisite ๊ด€๊ณ„ ์ˆ˜
74+
SC: O(V + E), ๊ทธ๋ž˜ํ”„ + ์ง„์ž…์ฐจ์ˆ˜ ๋ฐฐ์—ด
75+
"""
76+
class Solution:
77+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
78+
# 1) ๊ทธ๋ž˜ํ”„(์ธ์ ‘ ๋ฆฌ์ŠคํŠธ)์™€ ์ง„์ž…์ฐจ์ˆ˜ ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
79+
adj = [[] for _ in range(numCourses)]
80+
indeg = [0] * numCourses
81+
for a, b in prerequisites: # b -> a (b๋ฅผ ๋จผ์ € ๋“ค์–ด์•ผ a๋ฅผ ๋“ค์„ ์ˆ˜ ์žˆ์Œ)
82+
adj[b].append(a)
83+
indeg[a] += 1
84+
85+
# 2) ์ง„์ž…์ฐจ์ˆ˜ 0์ธ ์ •์ ๋“ค๋กœ ํ ์ดˆ๊ธฐํ™”
86+
q = deque([i for i in range(numCourses) if indeg[i] == 0])
87+
taken = 0 # ์ฒ˜๋ฆฌ(์ˆ˜๊ฐ•) ์™„๋ฃŒํ•œ ๊ณผ๋ชฉ ์ˆ˜
88+
89+
# 3) ํ์—์„œ ๋นผ๋ฉฐ ๊ฐ„์„  ์ œ๊ฑฐ(=ํ›„์† ๊ณผ๋ชฉ ์ง„์ž…์ฐจ์ˆ˜ ๊ฐ์†Œ)
90+
while q:
91+
u = q.popleft()
92+
taken += 1
93+
for v in adj[u]:
94+
indeg[v] -= 1
95+
if indeg[v] == 0:
96+
q.append(v)
97+
98+
# 4) ๋ชจ๋‘ ์ฒ˜๋ฆฌ๋์œผ๋ฉด ์‚ฌ์ดํด ์—†์Œ
99+
return taken == numCourses
100+
101+
102+
"""
103+
DFS ๊ธฐ๋ฐ˜
104+
TC: O(V + E), V: ๊ณผ๋ชฉ ์ˆ˜, E: prerequisite ๊ด€๊ณ„ ์ˆ˜
105+
SC: O(V + E), ๊ทธ๋ž˜ํ”„ + ํƒ์ƒ‰ ์ค‘์ธ ๊ณผ๋ชฉ ์ง‘ํ•ฉ + ์ˆ˜๊ฐ• ์™„๋ฃŒํ•œ ๊ณผ๋ชฉ ์ง‘ํ•ฉ
106+
"""
107+
class Solution:
108+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
109+
graph = {i: [] for i in range(numCourses)}
110+
for crs, pre in prerequisites:
111+
# ์„ ์ˆ˜ ๊ณผ๋ชฉ์„ ์›์†Œ๋กœ ์ถ”๊ฐ€
112+
graph[crs].append(pre)
113+
114+
# ํƒ์ƒ‰์ค‘
115+
traversing = set()
116+
# ์ˆ˜๊ฐ•๊ฐ€๋Šฅํ•œ ๊ณผ๋ชฉ
117+
finished = set()
118+
119+
def can_finish(crs):
120+
if crs in traversing:
121+
return False
122+
if crs in finished:
123+
return True
124+
125+
traversing.add(crs)
126+
for pre in graph[crs]:
127+
if not can_finish(pre):
128+
return False
129+
traversing.remove(crs)
130+
finished.add(crs)
131+
return True
132+
133+
for crs in graph:
134+
if not can_finish(crs):
135+
return False
136+
return True
137+
138+
from functools import cache
139+
140+
# ์ค„์ธ ์ฝ”๋“œ
141+
class Solution:
142+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
143+
graph = {i: [] for i in range(numCourses)}
144+
for crs, pre in prerequisites:
145+
graph[crs].append(pre)
146+
147+
traversing = set()
148+
149+
@cache
150+
def can_finish(crs):
151+
if crs in traversing:
152+
return False
153+
154+
traversing.add(crs)
155+
result = all(can_finish(pre) for pre in graph[crs])
156+
traversing.remove(crs)
157+
return result
158+
159+
return all(can_finish(crs) for crs in graph)

โ€Žsearch-in-rotated-sorted-array/hi-rachel.pyโ€Ž

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,33 @@
11
"""
22
https://leetcode.com/problems/search-in-rotated-sorted-array/solutions/
33
4-
๋ฌธ์ œ: ํšŒ์ „๋œ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด nums์—์„œ target ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ.
5-
6-
Idea: ์ด์ง„ ํƒ์ƒ‰ ํŒจํ„ด ์‚ฌ์šฉ
4+
- in โ†’ ๋ฆฌ์ŠคํŠธ ์ „์ฒด๋ฅผ ์„ ํ˜• ํƒ์ƒ‰ (O(N))
5+
- index โ†’ ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ ํ˜• ํƒ์ƒ‰ (O(N))
76
8-
TC: O(logN)
7+
Brute Force
8+
TC: O(N)
99
SC: O(1)
1010
"""
1111

1212
from typing import List
1313

14+
15+
class Solution:
16+
def search(self, nums: List[int], target: int) -> int:
17+
if target in nums:
18+
return nums.index(target)
19+
else:
20+
return -1
21+
22+
"""
23+
๋ฌธ์ œ: ํšŒ์ „๋œ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด nums์—์„œ target ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ.
24+
25+
Idea: ์ด์ง„ ํƒ์ƒ‰ ํŒจํ„ด ์‚ฌ์šฉ
26+
27+
28+
TC: O(logN), while ๋ฃจํ”„์—์„œ ๋งค๋ฒˆ ์ ˆ๋ฐ˜์”ฉ ์ค„
29+
SC: O(1)
30+
"""
1431
class Solution:
1532
def search(self, nums: List[int], target: int) -> int:
1633
left, right = 0, len(nums) - 1

0 commit comments

Comments
ย (0)