Skip to content

Commit 4925402

Browse files
authored
Merge pull request DaleStudy#1003 from sungjinwi/main
[suwi] Week 09
2 parents 6cbe69c + 4634265 commit 4925402

File tree

6 files changed

+200
-20
lines changed

6 files changed

+200
-20
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"""
2+
ํ’€์ด :
3+
์ตœ์ดˆ ์‹œ์ž‘ ์‹œ nums[left]๊ฐ€ nums[right]๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ๋Š” n๋งŒํผ rotate๋œ ์ƒํƒœ(์›๋ž˜ ์ž์‹ )
4+
๊ฐ™์€ ๊ฒฝ์šฐ๋Š” len(nums) == 1์ธ ๊ฒฝ์šฐ
5+
mid์™€ right์˜ ๊ฐ’์„ ๋น„๊ตํ•ด์„œ mid์˜ ๊ฐ’์ด ์ž‘๋‹ค๋ฉด mid๋ถ€ํ„ฐ right๊นŒ์ง€๋Š” ์ •๋ ฌ๋˜์žˆ์œผ๋ฏ€๋กœ ์ขŒ์ธก์— ์ตœ์†Ÿ๊ฐ’ ์กด์žฌ
6+
-> right = mid - 1
7+
๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋Š” ์ตœ์†Ÿ๊ฐ’์ด ์šฐ์ธก์— ์žˆ์œผ๋ฏ€๋กœ left = mid + 1
8+
9+
- left, mid, right์„ ์ ์ ˆํžˆ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์‹ ๊ตฌํ˜„ ์ž˜ํ•  ๊ฒƒ
10+
- mid๊ฐ€ ์ตœ์†Ÿ๊ฐ’์ผ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
11+
12+
nums์˜ ๊ธธ์ด : n
13+
14+
TC : O(logN)
15+
๋ฐ˜์”ฉ ๋‚˜๋ˆ ์„œ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ log2N
16+
17+
SC : O(1)
18+
"""
19+
20+
class Solution:
21+
def findMin(self, nums: List[int]) -> int:
22+
left = 0
23+
right = len(nums) - 1
24+
if nums[left] <= nums[right] :
25+
return nums[left]
26+
while (nums[right] < nums[left]):
27+
mid = (left + right) // 2
28+
if nums[mid - 1] > nums[mid]:
29+
return nums[mid]
30+
if nums[mid] < nums[right] :
31+
right = mid - 1
32+
else :
33+
left = mid + 1
34+
return nums[left]

โ€Žlinked-list-cycle/sungjinwi.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""
2+
ํ’€์ด :
3+
set์— ์ง€๋‚˜์˜จ node๋ฅผ ์ €์žฅํ•˜๊ณ  ์ƒˆ node๋กœ ์ด๋™ํ•˜๋ฉด set์•ˆ์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
4+
์ด๋ฏธ ์กด์žฌํ•˜๋Š” node๋ฅผ ์ง€๋‚˜๋ฉด True
5+
None์— ๋„๋‹ฌํ•˜๋ฉด False
6+
7+
๋…ธ๋“œ์˜ ๊ธธ์ด = n
8+
9+
TC : O(N)
10+
11+
SC : O(N)
12+
"""
13+
14+
# Definition for singly-linked list.
15+
# class ListNode:
16+
# def __init__(self, x):
17+
# self.val = x
18+
# self.next = None
19+
20+
class Solution:
21+
def hasCycle(self, head: Optional[ListNode]) -> bool:
22+
visited = set()
23+
while head :
24+
if head in visited :
25+
return True
26+
else :
27+
visited.add(head)
28+
head = head.next
29+
return False
Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,35 @@
11
"""
2-
/ํ’€์ด ๋ด๋„ ์ž˜ ์ดํ•ด ๋ชปํ•ด์„œ ์ถ”๊ฐ€ ์ฝ”๋ฉ˜ํŠธ/
3-
nums[i]๊ฐ€ ๊ทธ ์ „๊นŒ์ง€ subarray์˜ ํ•ฉ total๋ณด๋‹ค ์ž‘์€ ์Œ์ˆ˜์ธ ์ผ€์ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฑฐ์ง€ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ
4-
ex) total : -1, nums[i] = -2
5-
์–ด์ฐจํ”ผ -1์ธ ์‹œ์ ์— maxTotal์ด ์—…๋ฐ์ดํŠธ ๋์œผ๋ฏ€๋กœ total์€ nums[i]๋ถ€ํ„ฐ ๋”ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ -2๋กœ ์„ค์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์Œ
6-
๋”ฐ๋ผ์„œ ์ด์ „๊นŒ์ง€ subarray์˜ ํ•ฉ๋งŒ ์Œ์ˆ˜ ์–‘์ˆ˜ ์ฒดํฌ
7-
8-
TC : for๋ฌธ ํ•œ๋ฒˆ
9-
=> O(N)
10-
SC : ์ถ”๊ฐ€์ ์ธ ๋ฐฐ์—ด ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ์“ฐ์ง€ ์•Š์œผ๋ฏ€๋กœ
11-
=> O(1)
2+
** ์‹ค์ˆ˜๋กœ ์˜ˆ์ „ ๊ณผ์ œ ์ˆ˜ํ–‰ ๋•Œ ๋‹ค๋ฅธ ๊ณผ์ œํด๋”์— ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ํŒŒ์ผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค!!
3+
4+
ํ’€์ด :
5+
nums์˜ ๊ตฌ์„ฑ์š”์†Œ num์— ๋”ฐ๋ผ ๊ฐ๊ฐ ํ›„๋ณด1, ํ›„๋ณด2, ํ›„๋ณด3 ์ค‘์—
6+
๊ฐ€์žฅ ํฐ ๊ฐ’์€ ์ƒˆ๋กœ์šด max_res, ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์€ ์ƒˆ๋กœ์šด min_res
7+
8+
ํ›„๋ณด1: ์ด์ „ max_res * ํ˜„์žฌ num (num์ด ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ ๊ฐ€์žฅ ํด ๊ฐ€๋Šฅ์„ฑ)
9+
ํ›„๋ณด2: ์ด์ „ min_res * ํ˜„์žฌ num (num์ด ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ ๊ฐ€์žฅ ํด ๊ฐ€๋Šฅ์„ฑ)
10+
ํ›„๋ณด3: ํ˜„์žฌ num (num์ด ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ ๊ฐ€์žฅ ํด ๊ฐ€๋Šฅ์„ฑ)
11+
12+
์ƒˆ๋กœ์šด max_res์™€ max_total์„ ๋น„๊ตํ•ด์„œ ์—…๋ฐ์ดํŠธ
13+
14+
15+
๋ฉ”๋ชจ :
16+
- ํ˜„์žฌ num์ด 0์ผ ๊ฒฝ์šฐ ํ›„๋ณด ์…‹ ๋ชจ๋‘ 0
17+
- ์Œ์ˆ˜ ์–‘์ˆ˜ 0 ๋“ฑ์œผ๋กœ ์กฐ๊ฑด์„ ๋‚˜๋ˆ„์ง€ ์•Š๊ณ  min๊ณผ max๋กœ๋งŒ ๊ตฌ๋ถ„ํ•ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ค
18+
- max_res์™€ min_res๋Š” ๊ณฑํ•ด์ง€๋ฏ€๋กœ ์ดˆ๊ธฐํ™”๋ฅผ 1๋กœ ํ•œ๋‹ค (๋˜๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ธ๋ฑ์Šค๋กœ ๋ฐ˜๋ณตํ•˜๊ณ  1๋ถ€ํ„ฐ ์‹œ์ž‘)
19+
20+
21+
nums์˜ ๊ธธ์ด : n
22+
23+
TC : O(N)
24+
25+
SC : O(1)
1226
"""
27+
1328
class Solution:
14-
def maxSubArray(self, nums: List[int]) -> int:
15-
total = nums[0]
16-
maxTotal = nums[0]
17-
for i in range(1, len(nums)) :
18-
if (total < 0) :
19-
total = nums[i]
20-
else :
21-
total += nums[i]
22-
maxTotal = max(total, maxTotal)
23-
return (maxTotal)
29+
def maxProduct(self, nums: List[int]) -> int:
30+
max_total, max_res, min_res = nums[0], 1, 1
31+
for num in nums :
32+
min_res, max_res = min(num, max_res * num, min_res * num), \
33+
max(num, max_res * num, min_res * num)
34+
max_total = max(max_total, max_res)
35+
return max_total

โ€Žmaximum-subarray/sungjinwi.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""
2+
/ํ’€์ด ๋ด๋„ ์ž˜ ์ดํ•ด ๋ชปํ•ด์„œ ์ถ”๊ฐ€ ์ฝ”๋ฉ˜ํŠธ/
3+
nums[i]๊ฐ€ ๊ทธ ์ „๊นŒ์ง€ subarray์˜ ํ•ฉ total๋ณด๋‹ค ์ž‘์€ ์Œ์ˆ˜์ธ ์ผ€์ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฑฐ์ง€ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ
4+
ex) total : -1, nums[i] = -2
5+
์–ด์ฐจํ”ผ -1์ธ ์‹œ์ ์— maxTotal์ด ์—…๋ฐ์ดํŠธ ๋์œผ๋ฏ€๋กœ total์€ nums[i]๋ถ€ํ„ฐ ๋”ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ -2๋กœ ์„ค์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์Œ
6+
๋”ฐ๋ผ์„œ ์ด์ „๊นŒ์ง€ subarray์˜ ํ•ฉ๋งŒ ์Œ์ˆ˜ ์–‘์ˆ˜ ์ฒดํฌ
7+
8+
TC : for๋ฌธ ํ•œ๋ฒˆ
9+
=> O(N)
10+
SC : ์ถ”๊ฐ€์ ์ธ ๋ฐฐ์—ด ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ์“ฐ์ง€ ์•Š์œผ๋ฏ€๋กœ
11+
=> O(1)
12+
"""
13+
class Solution:
14+
def maxSubArray(self, nums: List[int]) -> int:
15+
total = nums[0]
16+
maxTotal = nums[0]
17+
for i in range(1, len(nums)) :
18+
if (total < 0) :
19+
total = nums[i]
20+
else :
21+
total += nums[i]
22+
maxTotal = max(total, maxTotal)
23+
return (maxTotal)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""
2+
ํ’€์ด : ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์ด์šฉ
3+
๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์˜ ๋“ฑ์žฅ ๋นˆ๋„๋ฅผ ํ™•์ธ, ์ฆ๊ฐ€, ๊ฐ์†Œ์‹œํ‚จ๋‹ค
4+
t์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์˜ ๋นˆ๋„๋ณด๋‹ค s์˜ ๋นˆ๋„๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ์ปค์งˆ ๋•Œ๊นŒ์ง€ right๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค
5+
left๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ s[left]์˜ ๋ฌธ์ž๋นˆ๋„๊ฐ€ t๋ณด๋‹ค ๋‚ฎ์•„์ง€๋Š” ์ง€์ ์„ ์ฐพ๋Š”๋‹ค
6+
๊ธฐ์กด์˜ min_total๊ธธ์ด๋ณด๋‹ค ์งง์œผ๋ฉด ans์— left, right ์ •๋ณด๋ฅผ ์ด์šฉํ•ด update
7+
8+
์•Œ๊ณ ๋‹ฌ๋ ˆ ์ฐธ์กฐ ๋ฐ ์ข€ ๋” ์ตœ์ ํ™” ํ•„์š”
9+
10+
s์˜ ๊ธธ์ด : n
11+
12+
"""
13+
14+
class Solution:
15+
def minWindow(self, s: str, t: str) -> str:
16+
left, right = 0, 0
17+
min_total = len(s)
18+
s_appear = {}
19+
t_appear = {}
20+
ans = ""
21+
for char in set(t):
22+
s_appear[char] = 0
23+
t_appear[char] = t.count(char)
24+
while (right < len(s)):
25+
if s[right] in s_appear:
26+
s_appear[s[right]] += 1
27+
if all(s_appear[char] >= t_appear[char] for char in t_appear.keys()):
28+
while left < right:
29+
if s[left] in s_appear:
30+
if s_appear[s[left]] == t_appear[s[left]]:
31+
break
32+
s_appear[s[left]] -= 1
33+
left += 1
34+
if (right - left + 1) < min_total:
35+
min_total = right - left + 2
36+
ans = s[left:right + 1]
37+
right += 1
38+
return ans
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""
2+
ํ’€์ด :
3+
๋น—๋ฌผ์ด ํ˜๋Ÿฌ๊ฐ€์„œ ๋ฐ”๋‹ค์— ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹Œ ์—ญ์œผ๋กœ ๋ฐ”๋‹ค์—์„œ ์ถœ๋ฐœํ•ด์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ๋Š”๋‹ค
4+
4๋ฐฉํ–ฅ ์ค‘์— height๊ฐ€ ํ˜„์žฌ ์œ„์น˜๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ์œ„๋กœ ํ˜๋Ÿฌ๊ฐˆ ์ˆ˜ ์žˆ๊ณ  visited set์— ์ €์žฅํ•ด์„œ
5+
์ด๋ฏธ ๋„๋‹ฌํ•œ ๊ณณ์€ return ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค
6+
๋ฐ”๋‹ค์™€ ์œ„์•„๋ž˜๋กœ ๋งž๋‹ฟ์€ ํ•ด์•ˆ๊ณผ ์ขŒ์šฐ๋กœ ๋งž๋‹ฟ์€ ํ•ด์•ˆ์—์„œ ๊ฐ๊ฐ ์ถœ๋ฐœํ•˜๋„๋ก ๋‘๋ฒˆ์˜ ๋ฐ˜๋ณต๋ฌธ์„ ์ˆ˜ํ–‰
7+
8+
r, c : ํ–‰๋ ฌ์˜ ๊ธธ์ด
9+
10+
TC : O(R * C)
11+
visited_set์„ ํ†ตํ•ด pacific, atlantic์ด ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ์„ฌ ์ „์ฒด๋ฅผ ํ•œ๋ฒˆ์”ฉ ์ˆœํšŒํ•˜๋ฏ€๋กœ
12+
13+
SC : O(R * C)
14+
๊ฐ set์˜ ํฌ๊ธฐ์™€ dfs ํ˜ธ์ถœ ์Šคํƒ์€ ์„ฌ ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜๋ฏ€๋กœ
15+
"""
16+
17+
class Solution:
18+
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
19+
paci_visited, atl_visited = set(), set()
20+
n_rows = len(heights)
21+
n_cols = len(heights[0])
22+
23+
def dfs(r: int, c: int, visited: set) -> None:
24+
if (r, c) in visited:
25+
return
26+
visited.add((r, c))
27+
for (m, n) in [(r + 1, c), (r - 1, c), (r, c + 1), (r, c - 1)]:
28+
if 0 <= m < n_rows and 0 <= n < n_cols:
29+
if heights[r][c] <= heights[m][n]:
30+
dfs(m, n, visited)
31+
32+
for r in range(n_rows):
33+
dfs(r, 0, paci_visited)
34+
dfs(r, n_cols - 1, atl_visited)
35+
36+
for c in range(n_cols):
37+
dfs(0, c, paci_visited)
38+
dfs(n_rows - 1, c, atl_visited)
39+
40+
result = []
41+
for both in paci_visited.intersection(atl_visited):
42+
result.append(list(both))
43+
44+
return result

0 commit comments

Comments
ย (0)