Skip to content

Commit 4925402

Browse files
authored
Merge pull request #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
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

+29
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

maximum-product-subarray/sungjinwi.py

+32-20
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

+23
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)

minimum-window-substring/sungjinwi.py

+38
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
+44
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)